namespaceの使い方 – プログラミング – Home

通知
すべてクリア

[解決済] namespaceの使い方


ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

MFC VC++ 6.0 OS XP
1.アプリケーションウィザードで、ダイアログベースのプロジェクト
「namespacetest]を作成する。
2.ns.hとns.cppを以下の内容で追加する。
*<ns.h>************************************************
namespace GlobalA{
CString a ;
CString b ;
} ;
void function(void) ;
*<ns.cpp>***************************************************
#include stdafx.h
#include ns.h

using namespace GlobalA ;

void function(void)
{
a = 1;
b = 2 ;
}
3.自動生成されたダイアログのOKボタンに対するハンドルを以下のように作成する。
*<namespacetestDlg.cpp>******************************************
#include ns.h
using namespace GlobalA ;
:
:
:
void CNamespacetestDlg::OnOK()
{
// TODO: この位置にその他の検証用のコードを追加してください
function() ;
AfxMessageBox(GlobalA::a) ;

CDialog::OnOK();
}

質問ですが、
ns.obj : error LNK2005: class CString GlobalA::a (?a@GlobalA@@3VCString@@A)
はすでに namespacetestDlg.obj で定義されています
ns.obj : error LNK2005: class CString GlobalA::b (?b@GlobalA@@3VCString@@A)
はすでに namespacetestDlg.obj で定義されています
というリンクエラーが出力されています。
どうしたらいいのかわかりません。
よろしくおねがいします。


引用未解決
トピックタグ
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 13年前
投稿: 138
 

ns.hを呼ぶたび定義しちゃってますからねぇ
ns.cppの中で定義して,ヘッダでexternかな?


返信引用
ガラ
 ガラ
(@ガラ)
ゲスト
結合: 20年前
投稿: 201
Topic starter  

hiroccoさん、レスありがとうございます。
実態のほうも、externのほうもnamespaceを宣言しないといけないんですね。
そこでまちがってました。ありがとうございました。
*<ns.h>************************************************
namespace GlobalA{
extern CString a ;
extern CString  b ;
} ;
void function(void)

*<ns.cpp>***************************************************
#include stdafx.h
#include ns.h
namespace GlobalA {
CString a ;
CString b ;
} ;

using namespace GlobalA ;

void function(void)
{
a = 1;
b = 2 ;
}
*<namespacetestDlg.cpp>******************************************
void CNamespacetestDlg::OnOK()
{
// TODO: この位置にその他の検証用のコードを追加してください
function() ;
AfxMessageBox(GlobalA::a) ;

CDialog::OnOK();
}


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 14年前
投稿: 40
 

あからさまなグローバル変数に嫌悪感ばりばり。


返信引用
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 13年前
投稿: 138
 

あらあら、まぁまぁ

あ、ついでに質問しちゃいます
DLLのなかでこんな感じのグローバル変数を定義したと仮定します
そして,あるアプリケーションでそのDLLを呼び出します
また,同じタイミング?そのDLLを利用しているアプリケーションが起動中に
まったく別のアプリケーションだけどやはりそのDLLを利用するものが
起動された場合って,同じ変数を参照できるものですか?
そして参照できたと仮定した場合,おなじDLLだけど
違うDLLファイルな場合ってどうなんですか?

ついででごめんなさい


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
結合: 4年前
投稿: 828
 

Win32において、
DLLのメモリ空間は、それを起動したプロセスのメモリ空間が使用されます。
コード部分は可能なら共用されますが、データ部分やスタックは
プロセス側のものが使用されます。
つまり、工夫しないとDLL内のコードを除く部分の共用はできないことに
なってるわけです。
そうでないとMFCなんぞまともに動くはずがありません。
あたりまえですよね(笑い)。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

>起動された場合って,同じ変数を参照できるものですか?
共有メモリみたいになって同じ「値」をとれるのか?
って意味の質問?

グローバルであってもされない。

>おなじDLLだけど違うDLLファイルな場合ってどうなんですか?
内容は同じだけど、別の場所・別名ってこと?
別のDLLとして扱われる。
1つのアプリケーションが読み込む場合でも別物になる。


返信引用
hirocco
 hirocco
(@hirocco)
ゲスト
結合: 13年前
投稿: 138
 

> あたりまえですよね(笑い)。
まぢですか

>1つのアプリケーションが読み込む場合でも別物になる。
なるほどぉ

えっと…
もう少し教えてもらいたいので
別に新規質問で出直しますね


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました