namespaceの使い方

[戻る]
ガラ 2011/02/23(水) 17:25:33
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 2011/02/23(水) 17:41:54
"ns.h"を呼ぶたび定義しちゃってますからねぇ
"ns.cpp"の中で定義して,ヘッダでexternかな?

ガラ 2011/02/23(水) 19:21:39
[[解決]]
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();
}

επιστημη [E-Mail] [HomePage] 2011/02/23(水) 22:45:15
あからさまなグローバル変数に嫌悪感ばりばり。

hirocco 2011/02/24(木) 11:40:09
あらあら、まぁまぁ

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

ついででごめんなさい

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

ryo 2011/02/24(木) 12:43:17
>起動された場合って,同じ変数を参照できるものですか?
共有メモリみたいになって同じ「値」をとれるのか?
って意味の質問?

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

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

hirocco 2011/02/24(木) 13:46:47
> あたりまえですよね(笑い)。
まぢですか

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

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

古いスレッドには追加発言できません。