2 C++
中存在main()
的有效版本:
int main() // version 1
int main(int argc, char **argv) // version 2
但是这两种重载不能同时共存。为什么不呢?(可能的用例:从终端运行程序时,如果没有传递参数,则调用第一个版本,否则调用第二个版本。
编译器是否执行特殊检查以允许每个二进制文件一个版本?
§3.6.1/2 (C++03( 说
实现不应预定义
main
函数。此功能应 不要超载。它应具有 返回类型为 int 的类型,否则 其类型是实现定义的。 所有实现应允许两者 主的以下定义:
int main() { /* ... */ }
int main(int argc, char* argv[]) { /* ... */ }
您可以使用其中任何一个。两者都符合标准。
此外,由于char *argv[]
等同于char **argv
,因此用char **argv
替换char *argv[]
没有任何区别。
但是两个版本不能同时共存!(用例可以是:从命令提示符运行二进制文件时,如果您不传递任何参数,则应称为第一个版本,否则应称为第二个版本(。
不。两个版本不能同时共存。一个程序可以只有一个main
功能。哪一个,取决于您的选择。如果要处理命令行参数,则必须选择第二个版本,否则第一个版本就足够了。另请注意,如果您使用第二个版本,并且不传递任何命令行参数,则不会造成任何伤害。它不会引起任何错误。你只需要解释argc
并相应地argv
,根据它们的值,你必须编写程序的逻辑和流程。
和Unix具有:
int main(int argc, char **argv, char **envp)
和 Win32 应用具有:
int WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
MacOS 具有:
int main(int argc, char **argv, char **envp, char **apple)
不要忘记,main
通常不是操作系统在执行程序时调用的第一件事。main
函数是由运行时环境调用的函数。要执行的第一条指令的地址通常在一些元数据中声明,通常在可执行文件的开头声明。
据我所知,以上都没有与C/C++标准相矛盾,只要只有一个,这是有道理的,因为如果有多个,操作系统将不知道该调用哪个。检查只有一个不是在编译器中完成的,而是在链接器中完成的。
C++ Standard 1998 和 2003 版本的第 3.6.1.2 节指出:
实现不应预定义主函数。此函数不得重载。它应具有 int 类型的返回类型,否则其类型是实现定义的。
进一步
ISOC++标准 (ISO/IEC 14882:1998( 明确要求 main 返回 int。它对格式良好的程序有明确的"应"约束。
§ 3.6.1 ¶ 2:
它应具有 int 的返回类型,但除此之外,其类型是实现定义的。所有实现都应允许以下两个 main 定义:
int main() { /* … */ }
和
int main(int argc, char* argv[]) { /* … */ }
因此,标准允许两个版本的main
,使用哪个版本作为程序员的实现偏好。
Main 是在 C 时代定义的。它更多地按照 printf 的规则进行设置。将main
视为一个瓦拉迪函数:
int main(...)
该标准说没有参数和两个指针参数是可以的。但是,如果实现想要提供更多参数,则实现可以自由地这样做。
不能有两个main
的原因与不能在 C 程序中定义两次类似printf
函数的原因相同。当然,printf
支持不同的参数,并根据存在哪些参数来改变它的行为,但它并不是C++意义上的重载。
标准规定main
不能超载。它不会损坏,并且不能有两个具有相同未修改名称的函数。我猜这会导致链接失败,但编译器可能希望添加显式检查以提供更清晰的错误消息。
int main(int argc, char **argv)
和 int main()
应该是它的首选签名,但编译器可以自由接受具有不同参数的main
。
在 C++ 中重载 main((,因为。 编译器显示以下错误:
error C2731: 'main' : function cannot be overloaded