main() 函数中的递归:意外的编译器行为
C 中通常不允许调用 main() 函数。然而,实际上,在某些平台上是可能的,特别是在带有 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中文网其他相关文章!