#pragma init_seg
pragma 指令の概要:インデックス への移動
構文(「疑似文法」を参照)
#pragma init_seg({ compiler | lib | user })
説明
#pragma init_seg
を使用すると、スタートアップ コードの実行順序を制御できます。
#pragma init_seg(compiler)
が指定されたコードは #pragma init_seg(lib)
が指定されたコードよりも先に実行され、#pragma init_seg(lib)
が指定されたコードは #pragma init_seg(user)
が指定されたコードよりも先に実行されます。
例
以下のファイルを含むプロジェクトがあるとします。
main.cpp | Unit1.cpp | Unit2.cpp |
---|---|---|
#include <vcl.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[]) {
return 0;
}
|
#include <iostream>
using namespace std;
class X {
public:
X() {
cout << "X ctor" << endl;
}
};
#pragma init_seg(lib)
static X x;
|
#include <iostream>
using namespace std;
class Y {
public:
Y() {
cout << "Y ctor" << endl;
}
};
#pragma init_seg(user)
static Y y;
|
このアプリケーションでは、以下が表示されます(メイン関数の return 文の行にブレークポイントを置き、コンソール出力を確認します)。
X ctor Y ctor
これは、グローバル変数 x
がグローバル変数 y
よりも先に初期化されることを意味しています。 初期化の順序を変更するには、#pragma init_seg
指令オプションを入れ替える必要があります。
main.cpp | Unit1.cpp | Unit2.cpp |
---|---|---|
#include <vcl.h>
#include <tchar.h>
int _tmain(int argc, _TCHAR* argv[]) {
return 0;
}
|
#include <iostream>
using namespace std;
class X {
public:
X() {
cout << "X ctor" << endl;
}
};
#pragma init_seg(user)
static X x;
|
#include <iostream>
using namespace std;
class Y {
public:
Y() {
cout << "Y ctor" << endl;
}
};
#pragma init_seg(lib)
static Y y;
|
このアプリケーションでは、以下が表示されます。
Y ctor X ctor