2011-01-18 15 views
0

オブジェクトを保持する変数を含むコードをデバッグするのに苦労しています。その価値は保持されません。このように、非参照変数の値を保持するg ++オプション

//foo.cpp 
CCustomClass cfoo = CStaticClass::cfoo_static; // cfoo_static is a static member object 

void footest() 
{ 
    // code here that use cfoo but cfoo is empty 
} 

//main.cpp 
int main() 
{ 
    footest(); 
    return 0; 
} 

cfooはfoo.cppのグローバルであることに注意してください。グローバル変数cfooの値を保持するg ++オプションがあるかどうかは疑問です。

そしてまた、私は参照を保持するためにcfooを変更した場合、アプリケーションが動作することに注意して取るこのような、

//foo.cpp 
CCustomClass& cfoo = CStaticClass::cfoo_static; // cfoo_static is a static member object 

しかし、私は最初の例を使用したいしてください。

アドバイスをしてください。ありがとう。

+0

もう一つの質問は、C++よりも問題の方が良いと思われます。 –

答えて

2

static initialization order fiascoが発生している可能性があります。 construct on first use idiomで解決できます。 cfooを、関数を初めて呼び出すときに値を初期化する関数にラップします。そうすれば、必要なときに初期化することが保証されます。今は、cfoo_staticの値を初期化する前に値を取得しています。

+0

ありがとうございます。しかし、関数を使用せずに "最初の使用法イディオム"を構築する他の方法はありますか?実際には、コードはgccコンパイラを使って別のプラットフォームで正常に動作します。しかし、g ++を使って別のプラットフォームに移植すると、問題が発生します。だから私はこの問題を回避する可能性のあるコンパイラオプションがあるのだろうかと思います。 – domlao

+0

いいえ、ありません。静的初期化の順序が異なり、動作するため、他のプラットフォームでも動作します。 –

+2

記事では「死ぬ確率は50%〜50%です」と述べています。たぶんそれは他のプラットフォームで動作するという事実は単なる運の問題です。それは実際にはないときにコードが良いように見えるので、不運。 – nobar

1
//foo.cpp 
CCustomClass cfoo = CStaticClass::cfoo_static; 

ここではCStaticClass::cfoo_staticを初期化しましたか?別の.cppで?

cfoofoo.cpp同じファイルでそれを初期化するようにしてください。このような何か:ところで

CCustomClass CStaticClass::cfoo_static = //initialization code! 
//foo.cpp 
CCustomClass cfoo = CStaticClass::cfoo_static; 

は、どのような値あなたとcfoo_staticを初期化するには、代わりにcfoo_staticに依存cfooを作ることを、なぜあなたはそれをしないだけでなくcfooを初期化するために同じを使用できますか?


を回避するにはCStaticClass::cfoo_staticを含むコードを変更できない場合は、多分これはあなたに役立つことができます:

//foo.cpp 
CCustomClass& cfoo() //a function with name cfoo!! 
{ 
    static CCustomClass foo =CStaticClass::cfoo_static; 
    return foo; 
} 

void footest() 
{ 
    //use cfoo() function! 

    cfoo().DoWork(); //an example 
} 
+0

>> CStaticClass :: cfoo_staticはどこで初期化しましたか?別の.cppで? ええ、別のファイルに、実際には、そのパブリックヘッダーを使用します。ありがとう – domlao

1

これは、グローバルデータの初期化の順序に関係しています。 cfoo_staticがcfooに割り当てられる前に初期化されたと想定することはできません。

グローバルデータの過剰使用を避けることをお勧めします。

これを解決できる方法の1つは、機能の1つで割り当てを実行することです。

+0

あまりにも悪いです、私はその実際のコードを変更するオプションがありません。おかげで – domlao

+1

あなたはコードのいずれかを変更することができますか、これをコンパイラオプションで修正する方法を探していますか? – nobar

+0

これを修正するコンパイラオプションがあることを願っています。ありがとう – domlao

1

あなたはシングルトン最新デザインのパッテンを使用して、このような何かやりたいことがあります。

CcustomClass* getFoo(void) { 
    static CcustomClass* cfoo = null; 
    if (cfoo == null) { 
     cfoo = new CcustomClass(); 
    } 
    return cfoo; 
} 

をして、あなたはそれを使用するたびからgetfooを呼び出します。

+0

これはシングルトンではありません。しかし、それは「最初の使用時に構築する」イディオムの形式です。それは正解です。 –

1

これを修正するコンパイラオプションはないと思います。問題はコード自体にundefined behaviorです。

ただし、ファイルがリンクされている順序を並べ替えることで、特定のプラットフォームで動作させることができます - しかし、これは大きな割合のですです。

関連する問題