什么是主要的正确的声明?
C ++ main
函数的正确签名是什么? 什么是正确的返回types,从main
返回一个值是什么意思? 什么是允许的参数types,它们的含义是什么?
这是系统特有的吗? 这些规则是否随着时间而改变? 如果我违反了他们会怎么样?
main
函数必须在全局名称空间中声明为非成员函数。 这意味着它不能是类的静态或非静态成员函数,也不能放置在名称空间(即使是未命名的名称空间)中。
除了作为全局命名空间中的函数之外,名称main
不保留在C ++中。 您可以自由地声明名为main
其他实体,其中包括不在全局名称空间中的类,variables,枚举,成员函数和非成员函数。
您可以声明一个名为main
的函数作为成员函数或名称空间,但是这样的函数不会是指定程序启动的main
函数。
main
函数不能声明为static
或inline
。 它也不能超载; 在全局名称空间中只能有一个名为main
函数。
main
函数不能在你的程序中使用:你不能在你的代码中的任何地方调用main
函数,也不允许你使用它的地址。
main
的返回types必须是int
。 没有其他的返回types是允许的(这个规则是粗体的,因为看到不正确的程序声明返回types为void
main
是很常见的;这可能是关于main
函数的最常违反的规则)。
有两个main
声明必须被允许:
int main() // (1) int main(int, char*[]) // (2)
在(1)中 ,没有参数。
在(2)中 ,有两个参数,它们通常分别被命名为argc
和argv
。 argv
是指向表示程序参数的Cstring数组的指针。 argc
是argv
数组中的参数个数。
通常, argv[0]
包含程序的名称,但事实并非总是如此。 argv[argc]
保证是一个空指针。
请注意,由于数组types参数(如char*[]
)实际上只是一个变相的指针types参数,下面两个都是写入(2)的有效方法,它们的意思完全相同:
int main(int argc, char* argv[]) int main(int argc, char** argv)
一些实现可能允许其他types和数量的参数; 你必须检查你的实现的文档,看看它支持什么。
预期main()
返回0表示成功,非0表示失败。 你不需要在main()
显式地写一个return
语句:如果你让main()
返回的时候没有显式的return
语句,就和你写的return 0;
。 以下两个main()
函数具有相同的行为:
int main() { } int main() { return 0; }
在<cstdlib>
中定义了两个macrosEXIT_SUCCESS
和EXIT_FAILURE
,它们也可以从main()
返回,分别表示成功和失败。
main()
返回的值被传递给exit()
函数,终止程序。
请注意,所有这些仅适用于编译托pipe环境(非正式的,有完整标准库的环境以及运行程序的操作系统)。 也可以为独立环境(例如,某些types的embedded式系统)编译C ++程序,在这种情况下,启动和终止完全由实现定义,并且甚至可能不需要main()
函数。 但是,如果您正在为现代桌面操作系统编写C ++,则需要编译托pipe环境。
从标准文档3.6.1.2主要function ,
它应该有一个types为int的返回types,否则它的types是实现定义的。 所有的实现都应该允许main的以下两个定义:
int main() { / ... / }
和int main(int argc, char* argv[]) { / ... / }
在后一种forms中,
argc
应该是运行程序的环境中传递给程序的参数的数量。如果argc不为零, 这些参数应该以argv [0]至argv [argc-1]的forms作为以空字符结尾的多字节string的初始字符 …..
希望有帮助..
两个有效的市电是int main()和int main(int,char * [])任何其他的东西都可以或不可以编译。 如果main没有显式返回一个值,则隐式返回0。
最新公布的标准(C ++ 14)的确切措词是:
一个实现应该允许两个
()
函数返回int
和
(int
,指向char)
指针char)
返回int
的函数作为
main
的types。
这明确指出,只要main
的types是int()
或int(int, char**)
types,就允许使用其他拼写。 所以以下也是允许的:
-
int main(void)
-
auto main() -> int
-
int main ( )
-
signed int main()
-
typedef char **a; typedef int b, e; e main(bd, ac)
有关返回值及其含义的详细信息
每3.6.1( [basic.start.main]
):
main
中的return语句具有离开main
函数的效果(销毁具有自动存储持续时间的任何对象),并以返回值作为参数调用std::exit
。 如果控制到达main
的结尾而没有遇到return
语句,效果就是执行的效果return 0;
std::exit
的行为在18.5节( [support.start.term]
)中详细介绍,并描述了状态码:
最后,控制权返回到主机环境。 如果状态为零或
EXIT_SUCCESS
,则返回状态成功终止的实现定义forms。 如果状态为EXIT_FAILURE
,则返回状态不成功终止的实现定义forms。 否则,返回的状态是实现定义的。