什么是正确的主要声明?
什么是C ++中main
函数的正确签名? 什么是正确的返回类型,从main
返回一个值意味着什么? 什么是允许的参数类型,它们的含义是什么?
这是系统特定的吗? 这些规则是否随着时间而改变? 如果我违反了他们会怎么样?
main
函数必须在全局名称空间中声明为非成员函数。 这意味着它不能是类的静态或非静态成员函数,也不能放置在命名空间(即使是未命名的命名空间)中。
除了作为全局名称空间中的函数之外,名称main
不保留在C ++中。 您可以自由地声明名为main
其他实体,其中包括不在全局名称空间中的类,变量,枚举,成员函数和非成员函数。
您可以声明一个名为main
的函数作为成员函数或名称空间,但这样的函数不会是指定程序启动位置的main
函数。
main
函数不能声明为static
或inline
。 它也不能超载; 在全局名称空间中只能有一个名为main
函数。
main
函数不能在你的程序中使用:你不能在你的代码的任何地方调用main
函数,也不允许你使用它的地址。
main
的返回类型必须是int
。 没有其他返回类型是允许的(该规则以粗体显示,因为看到不正确的程序以void
的返回类型声明main
;这可能是关于main
函数最常违反的规则)。
有两个main
声明必须被允许:
int main() // (1)
int main(int, char*[]) // (2)
在(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)
一些实现可能允许其他类型和数量的参数; 你必须检查你的实现的文档,看看它支持什么。
预期main()
返回0表示成功,非0表示失败。 你不需要在main()
显式地写一个return
语句:如果你让main()
返回的时候没有显式的return
语句,那就和你写入return 0;
。 以下两个main()
函数具有相同的行为:
int main() { }
int main() { return 0; }
在<cstdlib>
中定义了两个宏, EXIT_SUCCESS
和EXIT_FAILURE
,它们也可以分别从main()
返回以指示成功和失败。
main()
返回的值被传递给exit()
函数,该函数终止程序。
请注意,所有这些仅适用于编译托管环境时(非正式的,有完整标准库的环境以及运行程序的操作系统)。 也可以为独立环境(例如某些类型的嵌入式系统)编译C ++程序,在这种情况下,启动和终止完全由实现定义,并且甚至可能不需要main()
函数。 不过,如果您正在为现代桌面操作系统编写C ++,则需要编译托管环境。
来自标准文档,3.6.1.2主要功能,
它应该有一个类型为int的返回类型,否则它的类型是实现定义的。 所有的实现都应该允许main的以下两个定义:
int main() { / ... / }
和int main(int argc, char* argv[]) { / ... / }
在后一种形式中, argc
应该是从运行程序的环境传递给程序的参数的数量。如果argc不为零, 这些参数应该在argv [0]至argv [argc-1]中作为指向以空字符结尾的多字节字符串的初始字符 .....
希望这有助于..
最新公布的标准(C ++ 14)的确切措词是:
一个实现应该允许两个
()
函数返回int
和
(int
,指向char)
指针char)
返回int
的函数
作为main
的类型。
这表明只要main
的类型是int()
或int(int, char**)
类型,就允许使用其他拼写。 所以以下也是允许的:
int main(void)
auto main() -> int
int main ( )
signed int main()
typedef char **a; typedef int b, e; e main(bd, ac)
上一篇: What is the proper declaration of main?
下一篇: Can the arguments of main's signature in C++ have the unsiged and const qualifiers?