C で main() を再帰的に呼び出す
C 標準では、main() を再帰的に呼び出すことは許可されていないと規定しています。ただし、g コンパイラではこの慣行が許可されており、次のような異常なコードが許可されています。
<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(); }
実行時:
> g++ g.cpp; ./a.out y = 3 y = 6 y = 7</code>
アセンブリ コードを調べると、main が他の関数と同様に呼び出されることがわかります。 :
<code class="assembly">main: ... cmpl , -12(%rbp) je .L7 call main ... .L7: ... leave ret</code>
この動作は標準化されていませんが、反対意見がないことからわかるように、g は標準を強制するための緩和的なアプローチをとっているようです。ただし、-pedantic フラグを使用すると、皮肉な警告が発行されます:
g.cpp:8: error: ISO C++ forbids taking address of function '::main'
以上が標準で禁止されているにもかかわらず、C で `main()` を再帰的に呼び出すことはできますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。