#pragma exit と #pragma startup
Pragma 指令の概要:インデックス への移動
構文 (「疑似文法」参照)
#pragma startup FUNC [NN] #pragma exit FUNC [NN]
説明
これら 2 つのプラグマを使用すると、プログラム起動時(メイン関数が呼び出される前)かプログラム終了時(_exit を通じてプログラムが終了する直前)のどちらかで必ず呼び出される関数をプログラムで指定することができます。
指定される関数名は、引数を取らず void を返す宣言済みの関数でなければなりません。つまり、以下のように宣言されなければなりません。
void myfunc(void);
その場合、#pragma
は以下のようになります。
#pragma startup myfunc
優先度の指定
オプションの優先度パラメータ(NN
)は 64 から 255 までの範囲の整数でなければなりません。
- 最大の優先度は 0 です。
- 優先度が高い関数ほど、起動時に最初に呼び出され、終了時に最後に呼び出されます。
- 優先度を指定しない場合のデフォルトは、BCC32 の場合も Clang 拡張 C++ コンパイラ の場合も 100 です。
警告: BCC32 では、64 未満の優先度値を使用しないでください。 0 から 63 までの優先度は、RTL の起動および停止メカニズム用に予約されています。 Clang 拡張 C++ コンパイラの場合の例外については、以下のテキストで説明されています。
Clang 拡張 C++ コンパイラで構築されたアプリケーションでのユニットの初期化順序
-
- メモ: ユニットの初期化順序は
#pragma startup
で指定される順序より優先されなければなりませんが、これは現時点では Clang 拡張 C++ コンパイラ 向けには実装されていません。
- メモ: ユニットの初期化順序は
Clang 拡張 C++ コンパイラ ではユニットの初期化順序が使用されないので、優先度を指定せずに実行された終了時ルーチンはメイン フォームが閉じる前に終了してしまいます。 Clang 拡張 C++ コンパイラ を使用している場合は、#pragma exit
のルーチンが必ず __ExitVCL の後に実行されるように(また、BCC32 の動作と一致するように)、そのルーチンを優先度 30 で指定する必要があります。 例:
#pragma exit myfunc 30