18

C++03 3.6.1.3函数 main 不得在程序中使用(3.2)。...

我想知道为什么存在这条规则......有没有人知道如果使用 main 会出现问题的任何系统/实现?

PS 1. 我知道这个词的定义used。2. 我知道有一些简单的解决方法,例如从 main() 调用单个 MyMain() 并改用 MyMain()。3. 问题是关于现实世界的实现,如果没有限制,就会出现问题。谢谢!

4

3 回答 3

37

除了其他答案:c++ 规范保证所有静态初始化都发生在 main 被调用之前。

如果代码可以调用 main,那么一些静态作用域对象可以调用 main,在这种情况下,基本保证就被违反了。

规范不能说“静态范围的对象不应该调用 main()”,因为许多对象并不是专门编写为始终在静态范围内实例化的。它也不能说构造函数不应该调用 main() - 因为很难审计和证明构造函数没有调用方法,调用方法,有时可能会调用 main()。

于 2010-11-10T12:51:32.520 回答
17

我想这保留了实现的自由,可以main用代码前缀来构造全局变量和静态变量,接受标识环境和命令行参数的任何参数,并将它们映射到 C++ 的 argc/argv/env 约定,构建适当的堆栈和异常框架用于执行应用程序等。考虑到并非所有环境都允许可执行映像具有指定为要在之前运行的初始化代码的任何其他符号main()

类似地,清理代码可以附加到main(),以及对操作系统的调用,其中包含从 C 和 C++ 的 0/非零约定到该特定操作系统使用的实际成功/失败值的一些映射。

因此,从其他地方调用main可能会尝试对应用程序框架进行第二次重新初始化或强制意外退出操作系统——这对我来说听起来是灾难性的。

于 2010-11-10T11:49:19.317 回答
6

C++main()是一个奇怪的小函数,它具有不同的异常处理语法,不必返回值,即使它必须定义为返回 int 等。我不知道这是否会影响任何实际的实现,但是我猜想这个限制的存在是为了给编译器作者一些他们如何实现的自由度main()

于 2010-11-10T11:49:09.357 回答