首页 > 解决方案 > 在 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("");
}

clanggccmsvc中。所有这些编译器都打印相同的输出:

S ctor
1 2 3 4 5 6 7 8 9 10 
S dtor

因此,s尽管递归调用main. 是的,我知道未定义/未指定/实现定义的行为是什么意思。但是有人会更详细地解释(甚至通过任何可用的互联网编译器的代码演示)为什么main禁止在 C++ 程序中使用函数并且尤其可能导致意外结果?

标签: c++recursionmain

解决方案


推荐阅读