main()在C ++中重载?

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

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

但是两个超载不能同时并存。 为什么不? (可能的用例:从terminal运行程序时,如果没有parameter passing,则调用第一个版本,否则第二个版本是。)

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

§3.6.1/ 2(C ++ 03)说

一个实现不应该预定义main函数。 该function不得超载。 它应该有一个types为int的返回types,否则它的types是实现定义的。 所有的实现都应该允许main的以下两个定义:

  int main() { /* ... */ } int main(int argc, char* argv[]) { /* ... */ } 

你可以使用其中任何一个。 两者都符合标准。

另外,由于char *argv[]等价于char **argv ,因此用char *argv[] char **argvreplacechar *argv[]并没有什么区别。


但是两个版本不能同时共存! (用例可以是这样的:当从命令提示符运行二进制文件时,如果不传递参数,那么第一个版本应该被称为第二版本)。

不,两个版本不能同时共存。 一个程序只能有一个mainfunction。 哪一个,取决于你的select。 如果你想处理命令行参数,那么你必须select第二个版本,否则第一个版本就足够了。 另外请注意,如果你使用第二个版本,并且不要传递任何命令行参数,那么这里面没有任何伤害。 这不会导致任何错误。 您只需相应地解释argcargv ,并根据它们的价值,编写程序的逻辑和stream程。

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通常不是操作系统调用的第一个东西。 mainfunction是运行时环境调用的函数。 第一个要执行的指令的地址通常在一些元数据中声明,通常在可执行文件的开始处。

据我所知,只要只有一个,就没有任何一个与C / C ++标准相矛盾,这是有道理的,因为如果有多个操作系统,操作系统不知道该调用哪一个。 检查只有一个没有在编译器中完成,它是在链接器中完成的。

C ++ Standard 1998和2003版本的3.6.1.2节都指出:

一个实现不应该预定义主函数。 该function不得超载 。 它应该有一个types为int的返回types,否则它的types是实现定义的。

进一步,

ISO C ++标准(ISO / IEC 14882:1998)特别要求main返回int。 它对forms良好的程序有明确的“应该”限制。

第3.6.1节第2节:

它应该有一个返回types的int,否则它的types是实现定义的。 所有的实现都应该允许main的以下两个定义:

 int main() { /* … */ } 

 int main(int argc, char* argv[]) { /* … */ } 

因此,标准允许两种版本的main版本以及使用哪一版本作为程序员的实现偏好。

主要是在C天定义的。 它的设置更多地遵循printf的规则。 考虑main作为一个可变的function:

 int main(...) 

该标准说,没有参数和两个指针参数是好的。 但是,如果实现想要提供更多的参数,则实现是可以自由的。

你不能有两个main是因为你不能在C程序中定义一个类似于printf函数两次。 当然, printf支持不同的参数,并根据哪些参数改变它的行为,但它不是在C ++意义上的重载。

标准说main不能被重载。 它没有被破坏,而且你不能有两个具有相同unmangled名字的函数。 这将导致链接失败,我想,但编译器可能想要添加显式检查,以给出更清晰的错误消息。

int main(int argc, char **argv)int main()应该是它的首选签名,但是编译器可以自由接受具有不同参数的main

在C ++中重载main()是不可能的,因为。 编译器显示如下错误:

 error C2731: 'main' : function cannot be overloaded