2

私はよくある質問でSIOFについて読みましたが、それでも問題が発生する理由がよくわかりません。静的ライブラリ(.a)があり、そのライブラリを使用して静的constデータメンバーオブジェクトタイプを使用しています。次に、その静的constデータメンバーオブジェクトタイプを使用して、グローバル変数(オブジェクト)に割り当てます。しかし、そのグローバル変数をメイン関数または任意のローカル関数に使用すると、グローバル変数が空になっているようです。私の問題がSIOFであることは明らかですが、静的constデータメンバーオブジェクトが初期化されなかった理由を本当に理解していません。

これは静的ライブラリだったので、静的ライブラリを作成したときに、静的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データメンバーオブジェクトが初期化されなかったのはなぜですか?

どうもありがとう。

4

1 に答える 1

4

静的初期化順序の大失敗はかなり単純です。単一の変換ユニット内の静的オブジェクトは、宣言された順序で初期化されますが、異なる変換単位内の静的オブジェクトがそれぞれに関して初期化される順序については保証されません。他の。

したがって、特定の例では、foosinはで宣言されているのmain.cpp前に初期化される場合があります。foo::foofaalibsource.cpp

于 2011-01-19T01:58:58.377 に答える