为什么C和C ++中的主函数的类型留给用户去定义?
为什么main()是用户定义的函数?
我什么时候会使用void main()
和int main()
?
编辑这个答案是不完整的,因为它并没有真正解决奇怪的句子“,否则在一些实现定义的方式,现在我已经写了一个更完整的答案 ,这也解决了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
,但是它的返回类型仍然由实现决定,而不是程序员。
有三种情况:
- 独立执行
- 符合托管实施没有扩展
- 托管实施与扩展
在1.中不需要有一个名为main
的函数。 该实现定义了程序如何启动。
在2.一个程序开始执行一个名为main
的函数,用以下2个签名之一定义: int main(void)
或int main(int argc, char **argv)
在3.一个程序开始执行一个名为main
的函数,定义为实现允许的。 这个函数必须返回int
来符合标准。 例如: int main(int argc, char **argv, char **envp)
或int main(wchar_t**)
。 请注意,使用这些表单的程序不一定在所有托管实现中都有效(如果实现发生更改,则可能对原作者无效)。
最初在C语言中没有void类型,因此函数必须返回int。
实际上,返回int允许你从你的进程运行另外一个进程(使用fork和exec),如果你能得到这个进程的返回结果,你将知道它是否工作。
许多编译器不支持void main(),所以你应该总是使用int main()。