2012-02-25 27 views
16

为什么在C++中将入口点的返回类型设置为void一直不鼓励,后来被标准去除,现代编译器禁止?为什么它被认为是不好的做法?什么是错误的void main()?

现在,据我了解C#和Java都允许的入口点的返回类型为void

static void main(String[] args) /* Java */ 
static void Main(string[] args) /* C# */ 

和C#和Java程序员不认为这是不好的做法,他们实际上经常使用它。

这些

其它语种(仅是,我怀疑C++会成功在这十年中,至少)C的可能接班人++像d编程语言或瓦拉还允许void main()。正如你所看到的,我怀疑C++社区是否将它从标准中删除了,因为它太模糊或者不受欢迎。

所以我的问题是,为什么C++社区删除void main()?它有什么问题?

+1

不同的语言设计师做出不同的决定。为什么这有关系? – 2012-02-25 07:20:59

+0

@GregHewgill我明白这一点。但是C++设计师做出决定的因素和原因是什么? – ApprenticeHacker 2012-02-25 07:23:34

+1

直接从马的嘴:http://www2.research.att.com/~bs/bs_faq2.html#void-main :) – 2012-02-25 07:35:41

回答

10

C++标准委员会可能选择要求int main(),因为现有的大量代码预计会使用return语句将特定的退出代码返回到运行时系统。期望所有现有代码改为使用exit()代替,这是不合理的,因此int main()是标准中的一项要求。

Java等语言在设计时没有任何现有代码需要保持兼容。因此,设计人员可以选择void main()并要求使用System.exit()作为非零退出代码。

因此,对于C++标准选择void main()会是“错误的”,它会破坏预期使用return的现有代码和main()的退出代码值。

+1

我明白了。所以他们选择'int main()'来兼容现有的代码。大声笑,我应该知道...:D – ApprenticeHacker 2012-02-25 07:33:21

+2

我没有参加早期的C++标准会议,但我怀疑委员会真的选择了什么:从一开始就使用返回值是C++的一部分,因为它意味着基本上也是C的扩展.C基本上也被用来具有'int'返回(虽然通常隐含地声明:你可以最初放弃'int',编译器会假设这是你的意思)有一个方法自动判断程序是否成功。如果一个程序的结果是“无效的”,这并不表示它是否成功。 – 2012-02-25 07:52:48

8

您通常想知道程序的退出状态。这就是你有int main()的原因 - 你返回退出状态。

3

这是错误的,因为这不是C++标准指定的合法main。没有人关心其他语言指定的内容。对于C++程序,只有C++标准是相关的,它说int

+2

换句话说,这个问题是为什么这么说? – 2012-02-25 07:24:27

+0

@Soufiane:这个问题问为什么它是无效的# – Puppy 2012-02-25 07:42:56

+1

_这是错误的,因为这不是什么C++标准指定_ ... _只有C++标准是相关的_。大声笑,从这我收集, 'C++标准==最新的神圣遗嘱' – ApprenticeHacker 2012-02-25 07:49:11

10

C++有从来没有允许void main(),虽然有些编译器可能允许它作为扩展或只是因为他们不诊断它。

类似地C从来没有允许void main()以外的其他扩展名;引入void关键字的1989年相同标准定义了main的两个标准定义:int main(void)int main(int argc, char *argv[])

其他语言允许它,因为它们是其他语言。

能够编写void main()而不是int main()没有特别的优势。你甚至不需要显式地返回一个值; main的末尾相当于return 0;(在C++中,在C中以C99开头)。

+0

+1。然而,虽然它从未被允许,但即使Bjarne Stroustrup自己也写过“void main”,即在“C++编程语言”的第二版(也可能在第一版中,我没有检查过)。这只是一个模糊的东西,就像许多其他任意的常规惯例一样。 – 2012-02-25 07:45:50

+0

@ Cheersandhth.-Alf:我刚刚检查了TC++ PL的第二版(我认为是第9版),并没有看到任何对'void main()'的引用 - 尽管至少有一次'main()'带有一个隐式的'int'返回类型(语言不再允许这样做)。我检查了索引中对'main'的所有引用。是在我有的版本中纠正过的,还是我错过了什么? – 2012-09-28 09:09:25

+1

那么,就像你现在一样,Bjarne对2006年早些时候他做了这样的事情有些怀疑。 [http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be](http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be),我在哪里回答“我现在在第233页第7.3.2节末尾找到的第一个例子”。我现在没有这本书,但我认为我自己的参考是正确的。 :-) – 2012-09-28 10:14:36

相关问题