2011-01-19 23 views
1

faq-liteのSIOFについて読んだことがありますが、それでも問題の原因が分かりません。私は静的ライブラリ(.a)を持っており、静的constデータメンバオブジェクト型を使用するためにそのライブラリを使用しています。その後、その静的constデータメンバオブジェクトタイプIはグローバル変数(オブジェクト)を使用して割り当てます。しかし、グローバル変数をメイン変数またはローカル関数に使用すると、グローバル変数は空のようです。明らかに私の問題はSIOFであることが分かりますが、私の静的constデータメンバオブジェクトが初期化されなかった理由は本当にわかりません。私たちは、静的ライブラリを作成したときには、静的ライブラリた「静的初期化オーダー・フィアスコ」の詳細な説明のリクエスト

は、私は私が間違っているなら、私を修正し、静的定数データメンバオブジェクトがコンパイルされ、その静的ライブラリにリンクされていたと思います。..

//libsource.h 
class foo 
{ 
    public: 
    .... 

    public: 
    static const barbar foofaa; 
}; 

//libsource.cpp 
const barbar foo::foofaa = barbar(); 

//main.cpp 
#include <libsource.h> 

barbar foos= foo::foofaa; 

int main() 
{ 
    //can't use foos because its empty 
} 

してくださいアドバイスを。その静的constデータメンバオブジェクトが静的ライブラリ内にあっても初期化されなかったのはなぜですか?

多くのありがとうございます。

答えて

2

静的初期化順序の失敗は非常に簡単です.1つの翻訳単位内の静的オブジェクトは宣言された順序で初期化されますが、異なる翻訳単位の静的オブジェクトが初期化される順序は保証されません互いに関連している。

foosmain.cpp)は、libsource.cppで宣言されているfoo::foofaaより前に初期化されている可能性があります。

+0

こんにちは。その初期化部分について私には本当にぼんやりとしています。静的データメンバーを初期化する必要があるのはなぜですか?静的ライブラリを作成するためにコンパイルおよびリンクしたときに既に初期化されていますか?ご意見をお聞かせください。ありがとう – domlao

+1

@sasayins:静的変数は、プログラムを実行するまで初期化されません。彼らはあなたの静的なライブラリで使用されるのを待つ前に "初期化"されていません。したがって、あなたのプログラムが( 'main()'が呼び出される前に)起動すると、すべてのライブラリの静的変数をすべて初期化します。 – JaredC

+0

今、私にはとても分かりました。ありがとう。 – domlao

関連する問題