什么是正确的主要声明?

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

这是系统特定的吗? 这些规则是否随着时间而改变? 如果我违反了他们会怎么样?


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

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

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

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

main函数不能在你的程序中使用:你不能在你的代码的任何地方调用main函数,也不允许你使用它的地址。

main的返回类型必须是int 。 没有其他返回类型是允许的(该规则以粗体显示,因为看到不正确的程序以void的返回类型声明main ;这可能是关于main函数最常违反的规则)。

有两个main声明必须被允许:

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

(1)中 ,没有参数。

(2)中 ,有两个参数,它们通常分别被命名为argcargvargv是指向表示程序参数的C字符串数组的指针。 argcargv数组中的参数个数。

通常, 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_SUCCESSEXIT_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)
  • 链接地址: http://www.djcxy.com/p/28717.html

    上一篇: What is the proper declaration of main?

    下一篇: Can the arguments of main's signature in C++ have the unsiged and const qualifiers?