为什么在C ++中不允许调用main()

时间:2010-11-10 11:35:38

标签: c++ main

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

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

P.S。 1.我知道术语used的定义。 2.我知道有一些简单的解决方法,比如从main()调用单个MyMain()并使用MyMain()代替。 3.问题是关于实际的实现,如果不存在限制,出现问题。谢谢!

3 个答案:

答案 0 :(得分:35)

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

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

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

答案 1 :(得分:16)

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

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

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

答案 2 :(得分:4)

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