C ++中main
函数的正确签名是什么?什么是正确的返回类型,从main
返回值是什么意思?允许的参数类型是什么,它们的含义是什么?
这是系统特定的吗?这些规则会随着时间而改变吗?如果我违反它们会发生什么?
答案 0 :(得分:180)
必须在全局命名空间中将main
函数声明为非成员函数。这意味着它不能是类的静态或非静态成员函数,也不能放在命名空间(甚至是未命名的命名空间)中。
除了作为全局命名空间中的函数之外,名称main
不在C ++中保留。您可以自由地声明名为main
的其他实体,包括其他内容,类,变量,枚举,成员函数和不在全局名称空间中的非成员函数。
您可以将名为main
的函数声明为成员函数或命名空间,但这样的函数不会是指定程序启动位置的main
函数。
main
函数无法声明为static
或inline
。它也不能超载;在全局命名空间中只能有一个名为main
的函数。
main
函数无法在您的程序中使用:您不能从代码中的任何位置调用main
函数,也不允许您获取其地址。
main
的返回类型必须为int
。不允许使用其他返回类型(此规则以粗体显示,因为看到错误的程序声明main
的返回类型为void
是非常常见的;这可能是有关{的最常违反的规则{1}}功能)。
必须允许两个main
声明:
main
在(1)中,没有参数。
在(2)中,有两个参数,它们通常分别命名为int main() // (1)
int main(int, char*[]) // (2)
和argc
。 argv
是指向表示程序参数的C字符串数组的指针。 argv
是argc
数组中的参数数量。
通常,argv
包含程序的名称,但情况并非总是如此。 argv[0]
保证是空指针。
请注意,由于数组类型参数(如argv[argc]
)实际上只是伪装的指针类型参数,因此以下两个都是写(2)的有效方法,它们都是意思完全相同:
char*[]
某些实现可能允许其他类型和数量的参数;你必须检查你的实现文档,看看它支持什么。
预计 int main(int argc, char* argv[])
int main(int argc, char** argv)
返回零表示成功,非零表示失败。您不需要在main()
中明确地编写return
语句:如果您让main()
在没有明确main()
语句的情况下返回,则与您编写return
时的语句相同1}}。以下两个return 0;
函数具有相同的行为:
main()
int main() { }
int main() { return 0; }
中定义的两个宏EXIT_SUCCESS
和EXIT_FAILURE
也可以从<cstdlib>
返回,分别表示成功和失败。
main()
返回的值将传递给main()
函数,该函数将终止该程序。
请注意,所有这些仅适用于编译托管环境(非正式地,您拥有完整标准库且运行程序的操作系统)。也可以为独立环境(例如,某些类型的嵌入式系统)编译C ++程序,在这种情况下,启动和终止是完全实现定义的,甚至可能不需要exit()
函数。但是,如果您正在为现代桌面操作系统编写C ++,那么您正在为托管环境进行编译。
答案 1 :(得分:15)
来自标准文档。 3.6.1.2主要功能,
它会有回报 类型为int,但其类型为实现定义。所有实现都应允许以下两种情况 主要定义:
int main() { / ... / }
和
int main(int argc, char* argv[]) { / ... / }
在后一种形式中,
argc
应该是从环境中传递给程序的参数数量 程序运行。如果argc非零这些参数应在argv [0]中通过argv [argc-1]提供,作为指针 以null结尾的多字节字符串的初始字符 strong> .....
希望有所帮助..
答案 2 :(得分:4)
最新发布的标准(C ++ 14)的确切措辞是:
实施应允许两者
- 的函数
()
返回int
和
(int
的函数,指针指向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(b d, a c)
答案 3 :(得分:3)
两个有效电源为int main()
和int main(int, char*[])
。其他任何东西可能编译也可能不编译。如果main
未明确返回值,则会隐式返回 0 。
答案 4 :(得分:2)
返回值及其含义的详细信息
按照3.6.1([basic.start.main]
):
main
中的return语句具有离开main
函数(销毁具有自动存储持续时间的任何对象)并以返回值作为参数调用std::exit
的效果。如果控件到达main
的末尾而没有遇到return
语句,则效果是执行return 0;
std::exit
的行为详见第18.5节([support.start.term]
),并描述了状态代码:
最后,控制权返回给主机环境。如果status为零或
EXIT_SUCCESS
,则返回状态成功终止的实现定义形式。如果状态为EXIT_FAILURE
,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。