C 标准将 main 函数定义为每个程序的基本入口点。然而,问题出现了:“从内部调用 main() 是否可行?”
根据 C 标准,不可以。主函数一旦定义并执行,就标志着程序的开始和结束。递归调用 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 编译此类代码时,它会生成带有 -pedantic 标志的警告,提醒您它违反了 C 标准:
g.cpp:8: error: ISO C++ forbids taking address of function '::main'
虽然在某些情况下在其内部调用 main() 可能会起作用,但它并未得到 C 标准的正式认可。这违反了标准行为,可能会导致不同编译器和平台上出现未定义的结果。因此,强烈建议不要在生产代码中依赖这种非常规做法。
以上是你能在 C 中递归调用 main() 吗?的详细内容。更多信息请关注PHP中文网其他相关文章!