Main() は本当に C プログラムの開始ですか?
C 標準のセクション $3.6.1/1 では、すべてのプログラムがmain という名前のグローバル関数を含める必要があります。これは、指定された開始点として機能します。ただし、このアサーションに異議が唱えられると思われるシナリオが発生します。
次のコード サンプルを考えてみましょう。
int square(int i) { return i * i; } int user_main() { for (int i = 0; i < 10; ++i) { std::cout << square(i) << endl; } return 0; } int main_ret = user_main(); int main() { return main_ret; }
このコードは、0 から 2 までの整数の 2 乗を出力することで、意図した目的を正常に実行します。 main() 関数に入る前に 9 を実行してください。興味深いことに、GCC 4.5.0 で -pedantic フラグを使用すると、コードはエラーや警告なしでコンパイルされます。
この観察は、main() がプログラムの開始点です。このコードは、指定された開始点に入る前にユーザー定義の関数を実行しているようです。
「開始」の定義
この論争は、「」の正確な定義にかかっています。プログラムの始まりです。」規格ではこの用語を明確に定義しておらず、解釈の余地があります。 「開始」とはコードの最初の実行を意味し、この場合はuser_main() で実行されると主張する人もいるかもしれません。 「開始」とは、言語仕様で定義されている指定された開始点を指すと主張する人もいます。
主な違いは、C 標準の文の解釈にあります。プログラムには、 main と呼ばれるグローバル関数。これは、プログラムの指定された開始点です。標準は、基本的に、標準自体のコンテキストで用語「開始」を定義しています。main() が呼び出される前にコードが実行されないというわけではありません。代わりに、main() を、後続のすべての議論と定義に対するプログラムの指定された開始点として確立します。
この解釈に基づいて、提供されるコード サンプルは C 標準に準拠したままになります。関数user_main() は、標準で定義されているように、プログラムの「開始」前に実行されます。この前の実行は、main() で指定されたプログラムの開始点を無効にしません。
したがって、結論として、main() はその指定を保持します。この指定された開始点に到達する前にユーザー定義コードが実行される場合でも、C プログラムの開始点に到達します。標準の「開始」の定義は、この理解を明確にしています。
以上が`main()` は本当に C プログラムの実行の最初の行ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。