题
正确的签名是什么 main
C++ 中的函数?什么是正确的返回类型,以及从以下位置返回值意味着什么 main
?允许的参数类型有哪些,它们的含义是什么?
这是系统特定的吗?这些规则随着时间的推移而改变吗?如果我违反它们会怎样?
解决方案
在main
函数必须被声明为在全局命名空间的非成员函数。这意味着它不能是类的一个静态或非静态成员函数,也不能被放置在一个命名空间(甚至未命名命名空间)。
名称main
是不是在C ++保留除非在全局命名空间的功能。你可以自由申报命名main
,包括除其他事项外,类,变量,枚举,成员函数其他实体和非成员函数不是全局命名空间。
可以声明名为main
作为成员函数或命名空间中的功能,但这样的功能不会是main
功能,指定该程序启动。
在main
功能不能被声明为static
或inline
。它也不能超载;只能有一个在全局命名空间命名main
功能。
在main
功能不能在你的程序中使用:你不允许调用从任何地方main
功能在你的代码,也不是你允许把它的地址
<强> main
的返回类型必须是int
即可。没有其他的返回类型是允许(这一规则是大胆的,因为它是非常普遍的看到不正确的程序,申报main
与void
的返回类型,这可能是有关main
功能最频繁违反规则)
有一个必须被允许main
的两个声明:
int main() // (1)
int main(int, char*[]) // (2)
在的(1)下,没有参数。
在的(2)下,有两个参数,并且它们通常分别命名为argc
和argv
。 argv
是指向表示该参数给节目C字符串的数组。 argc
是的argv
阵列中参数的个数。
通常,argv[0]
包含程序的名称,但是这并非总是如此。 argv[argc]
保证是空指针。
注意,由于阵列类型参数(如char*[]
)实际上只是一个变相指针类型参数,下面的两个都有效的方式写入的(2)并它们都平均完全相同的事情:
int main(int argc, char* argv[])
int main(int argc, char** argv)
一些实施方式可以允许其它类型和参数数;你必须检查你的执行文件,看看它支持。
main()
有望回到零,以指示成功和非零以指示失败。您不需要明确写return
声明main()
:如果你让没有明确main()
声明return
回报,这是因为如果你写return 0;
相同。下面的两个main()
函数具有相同的特性:
int main() { }
int main() { return 0; }
有两个宏,EXIT_SUCCESS
和EXIT_FAILURE
,在<cstdlib>
定义的,也可以从main()
返回到分别指示成功和失败。
通过main()
返回的值被传递给exit()
功能,终止程序。
请注意,所有的这一种编译托管环境(非正式的,那就是你有一个完整的标准库,并有运行程序的操作系统的环境下),当只适用。另外,也可以向编译独立式环境中的C ++程序(例如,某些类型的嵌入式系统),在这种情况下,启动和终止是完全实现定义和甚至可以不要求一个main()
功能。如果你正在编写C ++的现代的桌面操作系统,但是,你正在编译的托管环境。
其他提示
来自标准文档, 3.6.1.2 主要功能,
它应具有INT类型的返回类型,但否则其类型是实现定义的。 所有实现均应允许以下两个主要定义:
int main() { / ... / }
和int main(int argc, char* argv[]) { / ... / }
在后一种形式中
argc
应是 传递给程序的参数数量 从程序运行的环境中 这些论点应通过argv [argc-1]在argv [0]中提供,作为零终止多端字符串的初始字符的指示.....
希望有帮助..
最新发布的标准(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)
在两个有效电源是int main()
和int main(int, char*[])
。任何其他人的事情可能会或可能不会进行编译。如果main
没有明确返回值,<强> 0 强>被隐式返回。
<强>详细信息上的返回值和它们的含义强>
每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
,返回状态成功终止的实现定义的形式。否则返回的状态是实现定义的。