c++ - 在 C++ 中禁止递归调用 main() 的原因
问题描述
C++ 标准说:
该函数
main
不得在程序中使用。
还有:
允许递归调用,但
main
函数除外。
同时C允许main
根据this answer这样的用法。我在该答案下找到了一条评论,内容如下:
全局构造函数的最简单实现(没有操作系统和底层 C 运行时入口代码的特殊支持)是 C++ 编译器在 main 开头生成一个函数调用(__main 是它的通用名称),它调用所有全局构造函数. 每次递归调用 main 时都重建全局对象将是一件相当糟糕的事情...... :-)
这是有道理的,但我尝试了以下代码:
#include <cstdio>
struct S {
S() { std::puts("S ctor"); }
~S() { std::puts("S dtor"); }
};
S s;
int main() {
static int count = 0;
count++;
if (count <= 10) {
std::printf("%d ", count);
return main();
}
std::puts("");
}
在clang、gcc、msvc中。所有这些编译器都打印相同的输出:
S ctor
1 2 3 4 5 6 7 8 9 10
S dtor
因此,s
尽管递归调用main
. 是的,我知道未定义/未指定/实现定义的行为是什么意思。但是有人会更详细地解释(甚至通过任何可用的互联网编译器的代码演示)为什么main
禁止在 C++ 程序中使用函数并且尤其可能导致意外结果?
解决方案
推荐阅读
- c# - SQL 连接/IsolatedStorage 错误 C# 控制台
- python - 如何在python中循环返回响应的函数?
- react-redux - 无法解析模块“module://expo-font.js”
- java - Spring Integration Dynamic Flows 线程问题
- bitbucket - Bitbucket 服务器 REST Api 更改文件
- c - fopen中的r+和a+有什么区别?
- python - 如何使用 pyspark 将时间戳转换为 unix 格式
- javascript - Shopify - 在变体更改时使用产品元字段更新 div
- c# - 在 Editor Window 插件中使用 WWW 和 UnityWebRequest
- mysql - 如何对每个表进行分组计数并按列打印?