What is the proper declaration of main?

fre*_*low 144 c++ program-entry-point c++-faq

What is the proper signature of the main function in C++? What is the correct return type, and what does it mean to return a value from main? What are the allowed parameter types, and what are their meanings?

这是系统特定的吗?这些规则会随着时间而改变吗?如果我违反它们会发生什么?

Jam*_*lis 186

main函数必须在全局命名空间中声明为非成员函数.这意味着它不能是类的静态或非静态成员函数,也不能放在命名空间(甚至是未命名的命名空间)中.

main除了作为全局命名空间中的函数之外,该名称不在C++中保留.您可以自由声明其他名称的实体main,包括类,变量,枚举,成员函数和不在全局名称空间中的非成员函数.

您可以声明一个名为main成员函数的函数或命名空间,但这样的函数不是main指定程序启动位置的函数.

main函数不能声明为staticinline.它也不能超载; main全局命名空间中只能有一个命名的函数.

main函数不能在您的程序中使用:您不能main从代码中的任何位置调用该函数,也不允许您获取其地址.

返回类型main必须是int.不允许使用其他返回类型(此规则以粗体显示,因为查看main使用返回类型声明的错误程序非常常见void;这可能是有关该main函数的最常违反的规则).

main必须允许两个声明:

int main()               // (1)
int main(int, char*[])   // (2)
Run Code Online (Sandbox Code Playgroud)

(1)中,没有参数.

(2)中,有两个参数,并且它们通常命名argcargv分别. argv是指向表示程序参数的C字符串数组的指针.argcargv数组中的参数数量.

通常,argv[0]包含程序的名称,但情况并非总是如此. argv[argc]保证是一个空指针.

请注意,由于数组类型参数(如char*[])实际上只是伪装的指针类型参数,因此以下两个都是写入(2)的有效方法,它们都表示完全相同的事情:

int main(int argc, char* argv[])
int main(int argc, char** argv)
Run Code Online (Sandbox Code Playgroud)

一些实现可以允许其他类型和数量的参数; 你必须检查你的实现文档,看看它支持什么.

main()预期返回零表示成功,非零表示失败.您不需要显式地编写return语句main():如果您在main()没有显式return语句的情况下返回,则与您编写的语句相同return 0;.以下两个main()函数具有相同的行为:

int main() { }
int main() { return 0; }
Run Code Online (Sandbox Code Playgroud)

有两个宏,EXIT_SUCCESS并且EXIT_FAILURE<cstdlib>其中定义的宏也可以分别返回main()以指示成功和失败.

返回的值main()传递给exit()函数,该函数终止程序.

请注意,所有这些仅适用于编译托管环境(非正式地,您拥有完整标准库并且运行程序的操作系统).也可以为独立环境(例如,某些类型的嵌入式系统)编译C++程序,在这种情况下,启动和终止是完全实现定义的,main()甚至可能不需要函数.但是,如果您正在为现代桌面操作系统编写C++,那么您正在为托管环境进行编译.

  • @Synetech:这个问题的第一句话是:"C++中主函数的正确签名是什么?" 并且问题被标记为[c ++]和[c ++ - faq].如果Java或C#用户(或其他任何人)仍然感到困惑,我无法帮助它.C#要求`Main`是一个静态成员函数,因为它甚至没有非成员函数.甚至C89也要求`main`返回`int`.我不太熟悉K&R C知道它的确切规则,但我猜它还需要`main`返回`int`,因为`main`没有返回类型有些常见而且K&R中没有type = implicit`int` . (4认同)
  • @Suhail:因为语言标准说返回类型应该是`int`. (3认同)
  • @Suhail:Visual C++允许`void`返回类型[作为语言扩展](http://msdn.microsoft.com/en-us/library/6wd819wh.aspx).不允许使用的编译器包括GCC和Comeau. (2认同)

lia*_*iaK 15

来自标准文档.,3.6.1.2主要功能,

它应该具有int类型的返回类型,否则其类型是实现定义的.所有实现都应允许以下两个主要定义:

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

在后一种形式中,argc应该是从运行程序的环境传递给程序的参数数量.如果argc非零,则这些参数应在argv [0]中通过argv [argc-1]提供,作为指向初始化的指针.以null结尾的多字节字符串的字符 .....

希望有所帮助..

  • 为什么`main`的返回类型应为`int`有什么具体原因? (2认同)