main()
中存在2个有效版本的C++
:
int main() // version 1
int main(int argc, char **argv) // version 2
但两种重载都不能同时共存。为什么不? (潜在用例:从终端运行程序时,如果没有传递参数,则调用第一个版本,否则第二个版本被调用。)
编译器是否执行特殊检查以允许每个二进制文件只有一个版本?
答案 0 :(得分:65)
§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
,并根据它们的值,编写程序的逻辑和流程。
答案 1 :(得分:20)
Windows和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 ++标准相矛盾,这是有道理的,因为如果有多个操作系统,操作系统不知道应该调用哪个。检查编译器中只有一个没有完成,它是在链接器中完成的。
答案 2 :(得分:13)
第3.6.1.2节声明:
实现不应预定义主函数。 此功能不得超载。它的返回类型应为int类型,否则其类型为实现定义。
此外,
ISO C ++标准(ISO / IEC 14882:1998)特别要求main返回int。它对格式良好的程序有明确的“应当”约束。
第3.6.1节¶2:
它的返回类型为int,但其类型是实现定义的。所有实现都应允许以下两个主要定义:
int main() { /* … */ }
和
int main(int argc, char* argv[]) { /* … */ }
因此,标准允许使用main
的两个版本,使用哪个版本作为程序员的实现首选项。
答案 3 :(得分:9)
主要是在C天定义的。它的设置更符合printf的规则。将main
视为varadic函数:
int main(...)
标准说没有参数和两个指针参数都可以。但是,如果实现想要提供更多参数,那么实现可以自由地执行。
您不能拥有两个main
的原因与您在C程序中无法两次定义printf
类似函数的原因相同。当然,printf
支持不同的参数,并根据哪些参数改变它的行为,但它不会在C ++的术语意义上重载。
答案 4 :(得分:7)
标准规定main
不能超载。它没有被破坏,你不能拥有两个具有相同unmangled名称的函数。我想这会导致链接失败,但编译器可能希望添加显式检查以便提供更清晰的错误消息。
int main(int argc, char **argv)
和int main()
应该是首选的签名,但编译器可以自由地接受具有不同参数的main
。
答案 5 :(得分:0)
不可能在C ++中重载main(),因为。编译器显示以下错误:
error C2731: 'main' : function cannot be overloaded