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 で定義されています
というリンクエラーが出力されています。
どうしたらいいのかわかりません。
よろしくおねがいします。
ns.hを呼ぶたび定義しちゃってますからねぇ
ns.cppの中で定義して,ヘッダでexternかな?
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();
}
あからさまなグローバル変数に嫌悪感ばりばり。
あらあら、まぁまぁ
あ、ついでに質問しちゃいます
DLLのなかでこんな感じのグローバル変数を定義したと仮定します
そして,あるアプリケーションでそのDLLを呼び出します
また,同じタイミング?そのDLLを利用しているアプリケーションが起動中に
まったく別のアプリケーションだけどやはりそのDLLを利用するものが
起動された場合って,同じ変数を参照できるものですか?
そして参照できたと仮定した場合,おなじDLLだけど
違うDLLファイルな場合ってどうなんですか?
ついででごめんなさい
Win32において、
DLLのメモリ空間は、それを起動したプロセスのメモリ空間が使用されます。
コード部分は可能なら共用されますが、データ部分やスタックは
プロセス側のものが使用されます。
つまり、工夫しないとDLL内のコードを除く部分の共用はできないことに
なってるわけです。
そうでないとMFCなんぞまともに動くはずがありません。
あたりまえですよね(笑い)。
>起動された場合って,同じ変数を参照できるものですか?
共有メモリみたいになって同じ「値」をとれるのか?
って意味の質問?
グローバルであってもされない。
>おなじDLLだけど違うDLLファイルな場合ってどうなんですか?
内容は同じだけど、別の場所・別名ってこと?
別のDLLとして扱われる。
1つのアプリケーションが読み込む場合でも別物になる。
> あたりまえですよね(笑い)。
まぢですか
>1つのアプリケーションが読み込む場合でも別物になる。
なるほどぉ
えっと…
もう少し教えてもらいたいので
別に新規質問で出直しますね