main() 関数の再帰: 予期しないコンパイラの動作
main() 関数の呼び出しは、一般に C では許可されません。ただし、実際には、一部のプラットフォーム、特に g コンパイラを備えた Linux システムでは可能な場合があります。この動作がどのように実現されるかを詳しく見てみましょう。
提供されたコード例では:
<code class="cpp">#include <iostream> #include <cstdlib> int main() { cout << "!!!Hello World!!!" << endl; system("pause"); return main(); }</code>
main() 関数内での main() の呼び出しにより、無限ループが可能になります。ただし、これは標準の C の動作ではありません。
コンパイラ マジックまたは未定義の動作?
マジック変数またはマクロを使用して、現在実行中の関数を取得することは可能ですか?いいえ、C 標準にはそのような規定はありません。
Linux コンパイラ例外
標準の禁止にもかかわらず、Linux g コンパイラは main() 呼び出しを含むコードをコンパイルします。 main() を実行してもエラーは発生しません。これは、コンパイラによる C 標準の寛大な解釈によるものです。
実践的なデモンストレーション
次のコードを考えてみましょう。
<code class="cpp">#include <cstdlib> #include <iostream> using namespace std; int main() { int y = rand() % 10; // returns 3, then 6, then 7 cout << "y = " << y << endl; return (y == 7) ? 0 : main(); }</code>
でコンパイルした場合g の場合、このコードは次のようなアセンブリ コードを生成します。
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
このアセンブリ コードでは、main は他の関数と同様に呼び出されます。 main() 関数内の main() への呼び出しは、通常の関数呼び出しに変換されます。
結論
main() 内から main() を呼び出すと、 C 標準では許可されていませんが、そのような動作を許容する特定のコンパイラを備えた特定のプラットフォームでは可能な場合があります。ただし、これは標準の C ではないため、環境やコンパイラのバージョンが異なると予期しない結果が生じる可能性があることを強調することが重要です。
以上がC では main() 関数自体を呼び出すことができますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。