为什么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. 独立执行
  2. 符合托管实施没有扩展
  3. 托管实施与扩展

在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()。