为什么C和c ++中的主要函数的类型留给用户去定义?
这个问题在这里已经有了答案:
编辑这个答案并不完整,因为它没有真正解决奇怪的句子“或以某种实现定义的方式”。 我现在写了一个更完整的答案,这也解决了C90,C11和C ++。 编辑结束
这是C标准所说的(ISO C 9899:1999):
5.1.2.1独立环境
在一个独立的环境中(C程序的执行可能没有任何操作系统的好处),程序启动时调用的函数的名称和类型是实现定义的。 / .. /独立环境中程序终止的影响是由实现定义的。
5.1.2.2托管环境
托管环境不需要提供,但应符合以下规范(如果存在)。
5.1.2.2.1程序启动
程序启动时调用的函数名为main。 该实现没有声明这个函数的原型。 它应该用返回类型int和不带参数来定义:
int main(void){/ * ... * /}
或者带有两个参数(这里称为argc和argv,尽管可以使用任何名称,因为它们是声明它们的函数的本地):
int main(int argc,char * argv []){/ * ... * /}
C ++标准中的文本或多或少是相同的。 请注意,文本中的“程序启动”是托管环境的子条款。
意即:
如果您的程序运行在无主机环境中(您的程序是嵌入式系统或操作系统),它可能有任何返回类型。 void main()是最常见的。
如果程序运行在托管环境中(在OS之上),main()必须返回int,并且可能有其他参数。
Lundin对C来说是正确的,但是在C ++中,措辞足够独特以产生影响:
[C++11: 3.6.1/1]:
程序应包含一个名为main
的全局函数,它是程序的指定开始。 它是实现定义是否需要在独立环境中的程序来定义main
功能。
[C++11: 3.6.1/2]:
实现不应该预定义main
函数。 该功能不得超载。 它应该有一个类型为int
的返回类型 ,否则它的类型是实现定义的[..]
第一个加粗的通道不会覆盖或取消第二个。
main
在C ++中返回int
,总是。
main
的返回类型取决于实现,而不是程序员。 检查您的编译器文档以查看合法签名的main
。 不要认为void main()
就是其中之一。 在托管环境中, main
通常返回int
。 在freestandaing环境中,入口点甚至可能不会被命名为main
,但其返回类型仍将由实现确定,而不是程序员。
上一篇: Why is the type of the main function in C and c++ left to the user to define?
下一篇: Must the int main() function return a value in all compilers?