什么是主要的适当声明?

时间:2010-11-17 17:12:00

标签: c++ main c++-faq

C ++中main函数的正确签名是什么?什么是正确的返回类型,从main返回值是什么意思?允许的参数类型是什么,它们的含义是什么?

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

5 个答案:

答案 0 :(得分:180)

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

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

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

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

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

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

必须允许两个main声明:

main

(1)中,没有参数。

(2)中,有两个参数,它们通常分别命名为int main() // (1) int main(int, char*[]) // (2) argcargv是指向表示程序参数的C字符串数组的指针。 argvargc数组中的参数数量。

通常,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_SUCCESSEXIT_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结尾的多字节字符串的初始字符 .....

希望有所帮助..

答案 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,则返回状态为不成功终止的实现定义形式。否则返回的状态是实现定义的。