ゲームが作れるようになるまでがんばる日記

ゲーム制作のことを中心にゲームに関することを書いています

ローカルでない静的オブジェクト

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()

Test1のコンストラクタが実行される前にTest1のメンバ関数が呼ばれてしまっている。