C + + 中 main 的正确声明是什么?

问题

  • 在 C + + 中,main函数的正确签名是什么?

  • 正确的返回类型是什么,从 main返回值意味着什么?

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

  • 这是特定于系统的吗?

  • 这些规则随着时间改变了吗?

  • 如果我违反了呢?

115194 次浏览

必须将 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()将返回零表示成功,非零表示失败。您不需要在 main()中显式地编写 return语句: 如果您让 main()返回时没有显式的 return语句,那么这与您编写了 return 0;一样。以下两个 main()函数具有相同的行为:

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

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

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

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

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

来自标准文件 3.6.1.2主要功能,

它会有回报的 类型为 int,但其他类型是实现定义的 主要定义:

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

在后一种形式中,argc应该是 传递给程序的参数个数 如果 argc 非零 < strong > ,这些参数将在 argv [0]到 argv [ argc-1]中提供,作为指向 以空结尾的多字节字符串的初始字符 ... ...

希望这能帮上忙。

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

每3.6.1([basic.start.main]) :

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

return 0;

std::exit的行为详见第18.5节([support.start.term]) ,并描述了状态代码:

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

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

实施应允许两者兼有

  • 返回 int

  • 一个 (int函数,指针指向返回 intchar)指针

作为 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)