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

问题描述 投票:0回答:3

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

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

附注1. 我知道

used
这个词的定义。 2. 我知道有一些简单的解决方法,例如从 main() 调用单个 MyMain() 并使用 MyMain() 代替。 3. 问题是关于现实世界的实现,如果不存在限制,“将会”出现问题。谢谢!

c++ program-entry-point language-design c++03
3个回答
37
投票

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

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


17
投票
main

上添加用于构造全局变量和静态变量的代码,接受任何标识环境和命令行参数的参数,并将它们映射到 C++ 的 argc/argv/env 约定,构造一个适当的应用程序执行的堆栈和异常框架等。考虑到并非所有环境都允许可执行映像在

main()
之前运行指定为初始化代码的任何其他符号。

类似地,清理代码可以附加到

main()

,以及对操作系统的调用,以及从 C 和 C++ 的 0/非零约定到该特定操作系统使用的实际成功/失败值的一些映射。


因此,从其他地方调用

main

可能会尝试第二次重新初始化应用程序框架或强制意外退出操作系统 - 对我来说听起来是灾难性的。

    


6
投票
main()

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

main()
    

© www.soinside.com 2019 - 2024. All rights reserved.