main()是否在C ++中重载?

时间:2011-06-20 07:46:40

标签: c++ overloading main

main()中存在2个有效版本的C++

int main()  // version 1
int main(int argc, char **argv)  // version 2

但两种重载都不能同时共存。为什么不? (潜在用例:从终端运行程序时,如果没有传递参数,则调用第一个版本,否则第二个版本被调用。)

编译器是否执行特殊检查以允许每个二进制文件只有一个版本?

6 个答案:

答案 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函数。哪一个,取决于您的选择。如果要处理命令行参数,那么您必须选择第二个版本,否则第一个版本就足够了。另请注意,如果您使用第二个版本,并且不传递任何命令行参数,那么它就没有任何损害。它不会导致任何错误。您只需相应地解释argcargv,并根据它们的值,编写程序的逻辑和流程。

答案 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)

C ++ Standard 1998和2003版本的

第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