Effective C++ 第1章4項
本には次のように書かれている。
異なる翻訳単位にある「ローカルでない静的オブジェクト」の初期化の順番はきめられていない。
これを理解するのにちょっと時間がかかった。
翻訳単位というのはソースコードのこと。つまり異なる翻訳単位というのは別のソースコードで書かれているということで、ローカルでないというのはもちろん、別のソースファイルから参照できるということ。このような場合、初期化の順番はどうなるか分からないということ。
実際に試してみたコードが次の通り。
test1.h
class Test1 { public: Test1() { cout << "Test1" << endl; } void func() { cout << "Test1::func()" << endl; } }; extern Test1 g_Test1;
test1.cpp
#include "test1.h" Test1 g_Test1;
test0.h
#include "test1.h" class Test0 { public: Test0() { cout << "Test0" << endl; g_Test1.func(); } void func() { cout << "Test0::func()" << endl; } }; extern Test0 g_Test0;
test0.cpp
#include "test0.h" Test0 g_Test0;
main.cpp
#include "test0.h" int main() { g_Test0.func(); g_Test1.func(); }
Test0,Test1のオブジェクトがあり、Test0のコンストラクタ内でTest1のメンバ関数を呼んでいるというもの。実行結果は次の通り。
Test0 Test1::func() Test1 Test0::func() Test1::func()