C 標準では、あらゆるプログラムの基本的なエントリ ポイントとして main 関数の概要を示しています。ただし、「main() を内部から呼び出すことは可能ですか?」
C 標準によれば、いいえです。 main 関数は、定義して実行すると、プログラムの開始と終了をマークします。 main() を再帰的に呼び出すことは、この基本原則に違反します。
しかし、実際には、Linux の g などの特定のコンパイラでは、main() 内での main() の型破りな呼び出しが許可されています。この動作は標準では明示的にサポートされていませんが、コンパイラの実装では許可されています。
たとえば、次のコードを考えてみましょう。
<code class="c++">#include <iostream> #include <cstdlib> using namespace std; int main() { int y = rand() % 10; // random number generation cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
このコードは乱数生成を実行します。生成された数値は 7 ではなく、main() を再帰的に呼び出します。
g によって生成されたアセンブリ コードを調べると、main() が他の関数と同じように呼び出されていることがわかります。 :
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
g がそのようなコードをコンパイルする際、C 標準に違反していることを通知する -pedantic フラグ付きの警告が生成されることに注意してください。
g.cpp:8: error: ISO C++ forbids taking address of function '::main'
それ自体の中で main() を呼び出すことは状況によっては機能する可能性がありますが、C 標準によって正式に認可されていません。これは標準の動作に違反しており、さまざまなコンパイラやプラットフォーム間で未定義の結果が生じる可能性があります。したがって、実稼働コードでこの型破りな慣行に依存することは強くお勧めできません。
以上がC で main() を再帰的に呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。