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函数不能声明为static或inline.它也不能超载; 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)中,有两个参数,并且它们通常命名argc和argv分别. argv是指向表示程序参数的C字符串数组的指针.argc是argv数组中的参数数量.
通常,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++,那么您正在为托管环境进行编译.
lia*_*iaK 15
来自标准文档.,3.6.1.2主要功能,
它应该具有int类型的返回类型,否则其类型是实现定义的.所有实现都应允许以下两个主要定义:
int main() { / ... / } 和
int main(int argc, char* argv[]) { / ... / }
在后一种形式中,
argc应该是从运行程序的环境传递给程序的参数的数量.如果argc非零,则这些参数应在argv [0]中通过argv [argc-1]提供,作为指向初始化的指针.以null结尾的多字节字符串的字符 .....
希望有所帮助..