关于c ++:main的正确声明是什么?

What is the proper declaration of main?

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

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


main函数必须declared作为一种非成员函数在全局命名空间。这意味这它不能是一个静态的或非静态成员函数的类,也可以placed它是在一个命名空间(夏娃的unnamed命名空间)。 </P >

的名称是不main保留在C + +除了作为一个函数的全局命名空间。你是自由的declare名main其他实体,包括在其他的事情,类,变量,enumerations,成员函数和非成员函数不在全局命名空间。 </P >

你可以declare的函数名main作为一个成员函数或命名空间中的一种,但这样的函数,会不会是"maindesignates函数,在程序的开始。 </P >

main函数不能被declared AS staticinline。。。。。。。它也不能被负载;有可以只有一个函数名main在全局命名空间。 </P >

main函数不能被用在你的程序:你是不允许打电话的main函数从anywhere在你的代码,或是你允许带到它的地址。 </P >

在返回类型main必须int。。。。。。。好的其他收益型是允许的(这个规则是在大胆的,因为它是非常普通的程序incorrect看到那declare main回报与A型void;这是最probably在竞相violated规则关于mainfunction)。 </P >

这是两部的声明说,main必须允许的: </P >

1
2
int main()               // (1)
int main(int, char*[])   // (2)

(1),这是好的参数。 </P >

(2),这是两个参数,和他们是conventionally名argcargv,分别为。argv是一个指针的数组C字符串的representing的arguments的程序。argc是数arguments在argv阵列。 </P >

通常,argv[0]包含的名称的程序,但这是不总是对的情况。argv[argc]是guaranteed OP是一个空指针。 </P >

值得注意的是,自安阵列型argument(状char*[])是真的只是一分型argument在disguise,下面的两种方法都是有效的写(2)和他们的两exactly均同样的事: </P >

1
2
int main(int argc, char* argv[])
int main(int argc, char** argv)

一些implementations可能允许其他类型的参数化和数字;你会要检查的文件执行,你看到它是什么支持。 </P >

main()是预期返回的成功表明零和非零的表明的故障。你是不需要的explicitly写一returnstatement在main():如果你让main()回报不安return显式声明,它的作为,如果你有一return 0;书写。下面的两main()函数有同样的行为: </P >

1
2
int main() { }
int main() { return 0; }

这是两个宏,EXIT_SUCCESSEXIT_FAILURE,定义在,也可以是returned从main()表明对成功和失败的,分别为。 </P >

该值由returned main()是通过对exit()函数,这terminates的程序。 </P >

值得注意的是所有的这applies当编写一个只读型环境(informally,安在你的环境中有一个全标准库和有一页操作系统运行你的程序。它也可能是编译到一个C + +程序的显示环境(例如,某些类型的嵌入式系统),在这一实例的启动和终止是wholly实现定义的函数和一个main()夏娃的要求是不可能的。如果你是写作的C + +的desktop现代操作系统,不过,y-o-u-r-e编写A型环境。 </P >


从标准docs.,3.6.1.2 main函数, </P >

It shall have a return
type of type int, but otherwise its type is implementation-defined. All implementations shall allow both of the following
definitions of main:

int main() { / ... / }int main(int argc, char* argv[]) { / ... / } </P >

In the latter form argc shall be the number of arguments passed to the program from the environment in which the
program is run.If argc is nonzero these arguments shall be supplied in argv[0] through argv[argc-1] as pointers to
the initial characters of null-terminated multibyte strings.....

希望这helps………………… </P >


最新公布的标准(C++ 14)的确切措辞是:

An implementation shall allow both

  • a function of () returning int and

  • a function of (int, pointer to pointer to char) returning int

as the type of 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)


有效期是两mains int main()int main(int, char*[])。。。。。。。其他的任何东西可能或不可能的编译。如果不mainT A explicitly返回值是0,implicitly returned。。。。。。。 </P >


细节是返回值和它们的意义 </P >

3.6.1每([basic.start.main]): </P >

A return statement in main has the effect of leaving the main function (destroying any objects with automatic storage duration) and calling std::exit with the return value as the argument. If control reaches the end of main without encountering a return statement, the effect is that of executing

1
return 0;

的行为是在详细的std::exit型(18.5 [support.start.term]),和describes的状态代码: </P >

Finally, control is returned to the host environment. If status is zero or EXIT_SUCCESS, an implementation-defined form of the status successful termination is returned. If status is EXIT_FAILURE, an implementation-defined form of the status unsuccessful termination is returned. Otherwise the status returned is implementation-defined.