为什么不允许调用主函数?

18

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

我想知道为什么有这个规定... 有人知道有哪些系统/实现会出现问题,如果使用了main函数吗?

P.S. 1. 我知道“使用”这个术语的定义。2. 我知道有简单的解决方法,比如从main()调用一个单独的MyMain()并使用MyMain()代替。3. 这个问题是关于现实世界中的实现,如果没有这个限制,会出现问题的。谢谢!


如果我没记错的话,在C语言中没有这样的限制,所以我的答案是“不”。 - avakar
我认为这意味着,在你的程序中,没有任何代码片段会调用 main(否则它只会加载一个顶部)。 - leppie
可能是Can main function call itself in C++?的重复问题。 - phuclv
虽然来晚了,但如果在10年内没有人提出明确调用main()会有问题的实现方式,我想答案就是“否”。 - Peter - Reinstate Monica
相关:为什么gcc会对decltype(main())发出警告,而clang不会?详细介绍了“使用”main到底意味着什么。 - undefined
3个回答

38
除了其他答案之外:C++规范保证在调用main函数之前已经完成所有静态初始化。
如果代码可以调用main函数,那么一些具有静态作用域的对象就可以调用main函数,这样就违反了一个根本保证。
规范不能说“静态作用域对象不应该调用main()”,因为许多对象并非专门编写以始终在静态作用域中实例化。它也不能说构造函数不应该调用main()——因为很难审计和证明构造函数不会调用一个方法,而这个方法可能有时会调用main()。

2
标准可以很容易地说,在动态初始化期间调用主函数是未定义行为。它也可以很容易地说,在主函数被实现自动调用之前调用主函数是未定义行为。 - undefined

18
我认为这保留了实现中在main前缀代码的自由,用于构造全局和静态变量、接受任何参数来识别环境和命令行参数并将它们映射到C++的argc/argv/env惯例、为应用程序构建适当的堆栈和异常框架等。需要考虑的是,并非所有环境都允许可执行映像有任何其他符号被指定为初始化代码在main()之前运行。
同样,清理代码可以附加到main()中,以及使用从C和C++的0/非零约定到实际成功/失败值的某些映射调用OS。
因此,在其他位置调用main可能会尝试对应用程序框架进行第二次重新初始化或强制意外退出到OS——这听起来对我来说是灾难性的。

6

C++中的main()是一个奇怪的小函数,对于异常处理有不同的语法,即使必须定义为返回int,也不需要返回值等等。我不知道这是否会影响任何真正的实现,但我猜想这种限制的存在是为了让编译器写手在实现main()时具有一定的灵活性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接