プログラムの実行はメインから開始する必要がありますか、それとも開始アドレスを変更できますか?
#include <stdio.h>
void fun();
#pragma startup fun
int main()
{
printf("in main");
return 0;
}
void fun()
{
printf("in fun");
}
in fun
このプログラムはの前に印刷しin main
ます。
プログラムの実行はメインから開始する必要がありますか、それとも開始アドレスを変更できますか?
#include <stdio.h>
void fun();
#pragma startup fun
int main()
{
printf("in main");
return 0;
}
void fun()
{
printf("in fun");
}
in fun
このプログラムはの前に印刷しin main
ます。
'#pragma'コマンドは、ANSI規格で指定されており、実装で定義された任意の効果があります。GNU Cプリプロセッサでは、「#pragma」は最初にゲーム「rogue」の実行を試みます。それが失敗した場合、ゲーム「ハック」を実行しようとします。それが失敗した場合、ハノイの塔を表示するGNUEmacsを実行しようとします。それが失敗した場合、致命的なエラーが報告されます。いずれの場合も、前処理は続行されません。
--Richard M. Stallman、GNU Cプリプロセッサ、バージョン1.34
プログラムの実行は、スタートアップコード、つまり「ランタイム」から始まります。これは通常、コンパイラパッケージに付属する_start
ファイル内にある(Unixマシン上で)呼び出されるアセンブラルーチンなどです。crt0.o
これは、C実行可能ファイルを実行するために必要なセットアップを実行します(stdin
C ++の...で使用されるベクトルのセットアップstdout
など)。グローバルオブジェクトの初期化、つまりコンストラクターの実行も含まれます。その場合にのみ、コントロールはにジャンプします。stderr
atexit()
main()
私の答えの冒頭の引用がとても雄弁に表現しているように、何をするか#pragma
は完全にあなたのコンパイラ次第です。そのドキュメントを確認してください。pragma startup
(ちなみに、この前にaを付ける必要があり#
ますが、ランタイムに最初に呼び出すように指示していると思いますfun()
...)
ISO C 標準に関する限り、C プログラムのエントリ ポイントは常にmain
(実装定義の機能を使用してオーバーライドされない限り)ホストされた実装のです。「独立した実装」 (通常はオペレーティング システムを持たない組み込みシステム) の場合、エントリ ポイントは実装によって定義されます。
Cプログラムは、必ずしもmain()
機能から開始する必要はありません。一部のコードはmain()
、初期化されていないすべてのグローバル変数をゼロにし、他のグローバル変数を適切な値で初期化する前に実行されます。たとえば、次のコードについて考えてみます。
int a;
int b = 10;
int main()
{
int c = a * b;
return 0;
}
上記のサンプルコードでは、a
とb
がそれぞれ割り当てられ0
、10
の最初の行が実行されmain()
ます。
ディレクティブは、#pragma
実装定義の動作を定義するためにあります。を使用したコードは#pragma
、一部のコンパイラではコンパイルできますが、別のコンパイラではコンパイルできない場合があります。