#pragma init_seg

提供: RAD Studio
移動先: 案内検索

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