如果编译得很好,`void main`怎么会无效?

时间:2016-08-04 13:22:42

标签: c++ c main

我在c ++编程语言的介绍中找到了int main定义,但没有void main。我试着阅读所有用c ++编程语言介绍的文章。

2 个答案:

答案 0 :(得分:6)

void main在C或C ++中从未有效。

C ++11§3.6.1/ 2:
  

实现不得预定义main函数。此功能不应过载。它应具有类型int的返回类型,否则其类型是实现定义的。所有实现都应允许main的以下两个定义:

int main() { /* ... */ }
     

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

...

C ++11§3.6.1/ 5:
  

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

return

值0是表示处理成功的一个值。来自return 0; 的值EXIT_SUCCESS可以是0或其他值。值<stdlib.h>表示进程失败。

答案 1 :(得分:4)

使用void main不是标准的,尽管有一些关于为什么某些编译器允许它的历史。

以下内容来自programingforums.org上的2008年帖子:

  

1971年,Denis Ritchie(与Ken Thomson一起工作   开发Unix)产生了一个新的B&#34;通过添加对角色的支持   类型,并修改早期B编译器输出机器代码。在   1972年,&#34;新B&#34;更名为C.预处理器于1973年左右加入   团队中的另一位程序员制作了便携式I / O.   package&#34;,后来被重命名为C&#34;标准I / O例程&#34;。   因此C的第一个版本诞生了:它只支持char,   整数和指针类型。没有void关键字。

     

Denis Ritchie和Brian Kernighan共同努力提升C.后来   C版本引入了更多的标准库,例如   malloc() - 最初返回指向char的指针,因为没有   无效指针。因此,在C的早期版本中始终需要   从malloc()转换返回。对浮点的支持也是如此   添加。这就是所谓的Kernighan和Ritchie(K&amp; R)C。

     

在20世纪80年代早期,决定批准C作为标准,   导致1989年第一个ANSI标准的发展(当时   在1990年被批准为ISO标准)。在委员会进程中领先   根据标准,进行了一些改动:特别是空白   引入了关键字,功能原型的形式发生了变化。

     

在标准化过程中,有几个商业编译器   发达。 其中一些支持void main()作为解决办法   关于从main()结束掉下来的编译器诊断。他们游说   C标准不支持这种做法,但是没有成功   没有被接受,因为其他供应商认为它没有显着增加   或有用的新功能。 后来,在20世纪90年代初,当&#34;标准   遵守&#34;成为一种营销工具,他们释放了律师   标准,并发现了 - 他们随后声称的措辞循环孔 -   允许void main()被视为标准。

     

在C标准化过程中,Bjarne Stroustrup开始工作   关于C ++的开发,并发布了ARM(Annotated Reference   手册)与玛格丽特埃利斯在1990年。由于这是同时发生的   与void main()相关的小混乱,这个特征是   永远不是C ++的一部分。 ARM是开发C ++的基础   标准,最终由ANSI于1998年批准,ISO于1999年批准。

     

在制定1999 C标准期间,进行了一些讨论   关于void main(),但它从来没有获得牵引力 - 推动支持   是政治性的,显然它提供了总体共识   技术效益不大。 明确表示1999 C标准   不允许它。