157

问题

  • mainC++中函数的正确签名是什么?

  • 什么是正确的返回类型,从 中返回值是什么意思main

  • 允许的参数类型是什么,它们的含义是什么?

  • 这是系统特定的吗?

  • 这些规则是否随着时间而改变?

  • 如果我违反它们会怎样?

4

5 回答 5

201

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

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

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

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

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

的返回类型main必须是int。不允许其他返回类型(此规则以粗体显示,因为经常看到错误的程序声明main返回类型为;这可能是有关该函数void的最常违反的规则)。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()预计返回零表示成功,非零表示失败。您不需要return在 : 中显式编写语句,main()如果您在没有显式语句的情况下让main()return return,则与编写 . 时相同return 0;。以下两个main()函数具有相同的行为:

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

其中定义了两个宏,EXIT_SUCCESS和,也可以从其中返回,分别表示成功和失败。EXIT_FAILURE<cstdlib>main()

返回的值main()被传递给exit()函数,该函数终止程序。

请注意,所有这些仅适用于为托管环境(非正式地,您拥有完整的标准库并且有一个运行您的程序的操作系统的环境)进行编译时。也可以为独立环境(例如,某些类型的嵌入式系统)编译 C++ 程序,在这种情况下,启动和终止完全由实现定义,main()甚至可能不需要函数。但是,如果您正在为现代桌面操作系统编写 C++,那么您正在为托管环境进行编译。

于 2010-11-17T17:19:25.380 回答
15

From Standard docs., 3.6.1.2 Main Function,

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() { / ... / } and int main(int argc, char* argv[]) { / ... / }

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.....

Hope that helps..

于 2010-11-18T05:21:18.127 回答
3

两个有效的电源是int main()int main(int, char*[])。其他任何东西都可能编译也可能不编译。如果main没有显式返回值,则隐式返回0 。

于 2010-11-17T17:49:03.543 回答
3

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

一个实现应允许两者

  • ()返回函数int

  • 的函数(int,指向char)返回指针的指针int

作为 的类型main

这清楚地表明,只要类型main是 typeint()或,就允许使用其他拼写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)
于 2017-07-01T09:22:40.490 回答
2

返回值及其含义的详细信息

根据 3.6.1 ( [basic.start.main]):

中的 return 语句main具有离开main函数(销毁具有自动存储持续时间的任何对象)并std::exit使用返回值作为参数进行调用的效果。如果控制到达末尾main没有遇到return语句,效果就是执行

return 0;

的行为std::exit在第 18.5 节 ( [support.start.term]) 中有详细说明,并描述了状态码:

最后,控制权返回到主机环境。如果状态为零或EXIT_SUCCESS,则返回状态成功终止的实现定义形式。如果状态为EXIT_FAILURE,则返回状态未成功终止的实现定义形式。否则返回的状态是实现定义的。

于 2012-01-02T02:46:11.963 回答