【问题标题】:What was Wrong with void main()?void main() 有什么问题?
【发布时间】:2012-03-15 13:47:05
【问题描述】:

为什么总是不鼓励在 C++ 中将入口点的返回类型设置为 void,后来又被标准删除并被现代编译器禁止?为什么它被认为是不好的做法?

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

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

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

其他语言(仅打算成为,我怀疑 C++ 至少会在这十年内取得成功)C++ 的可能继任者,如 D 编程语言或 Vala 也允许 void main() .如您所见,我怀疑 C++ 社区将其从标准中删除,因为它太晦涩或不受欢迎。

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

【问题讨论】:

  • 不同的语言设计者做出不同的决定。为什么重要?
  • @GregHewgill 我明白这一点。但促使 C++ 设计者做出决定的因素和原因是什么?
  • 实际上,这个问题是错误的:假设一个程序的结果至少表明成功或失败是一件好事,并且被用于创建 C 的上下文中(UNIX 工具经常使用这个指示) 问题应该是:为什么 Java 和 C# 社区取消了指示(和强制)指示程序成功的能力?这实际上隐含地回答了void main() 的问题:程序没有结果。此外,void main() 没有删除:它从未添加
  • 我会说使用异常是首选方式。如果程序抛出指示“经典”错误状态的异常,则内置错误处理程序应为您返回“经典”返回码等效值。手动操作是非常多余的。不过,您仍然可以在 Java 中使用像 exit(retcode) 这样的函数。您可以创建自己的顶级 catch 块来返回代码并使用 exit(...)。

标签: c++ standards main entry-point


【解决方案1】:

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

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

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

【讨论】:

  • 我明白了。所以他们选择int main() 是为了与现有代码兼容。大声笑,我应该知道... :D
  • 我没有参加早期的 C++ 标准会议,但我怀疑委员会是否真的选择了任何东西:返回值的使用从一开始就是 C++ 的一部分,因为它本质上是一个C 的扩展。C 本质上也曾经有一个 int 返回(尽管通常是隐式声明的:你最初可以不使用 int 并且编译器会假设这就是你的意思)有一种方法来自动判断是否一个程序成功了。如果程序的结果是void,这并不能说明它是否成功。
【解决方案2】:

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++ 中,在从 C99 开始的 C 中)。

【讨论】:

  • +1 的事实。然而,虽然从未被允许,但即使是 Bjarne Stroustrup 本人也写过void main,即在“C++ 编程语言”的第二版(可能也是第一版,我没有检查)中。就像许多其他武断且通常不好的约定一样,这只是一个模因。
  • @Cheersandhth.-Alf:我刚刚检查了 TC++PL 的第二版(我认为是第 9 版),并没有看到任何对 void main() 的引用——尽管在至少出现一次 main() 并带有隐式 int 返回类型(语言不再允许这样做)。我检查了索引中对main 的所有引用。是在我的版本中更正了吗,还是我遗漏了什么?
  • 嗯,就像你现在一样,Bjarne 对他在 2006 年做过类似事情的说法有点怀疑。参见例如http://groups.google.com/group/comp.lang.c++/msg/1fc435ef004677be,我回答“我现在在第 7.3.2 节末尾找到的第一个示例,第 233 页”。我现在没有那本书,但我认为我自己的参考是正确的。 :-)
  • 枪之子,在第二版的第 9 版中仍然存在。它也在第三版的第一次印刷:第 11.4 节,第 275 页。但它在errata 中提到,所以它必须在第二次印刷中得到更正(在你在 comp.lang 上提到它之后出现。 c++)。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这是错误的,因为这不是 C++ 标准指定为合法的main。没有人关心其他语言的规定。对于 C++ 程序,只有 C++ 标准是相关的,上面写着int

    【讨论】:

    • 问题,换句话说,它为什么这么说?
    • @Soufiane:问题问为什么它无效。#
    • 这是错误的,因为这不是 C++ 标准规定的 ... 只有 C++ 标准是相关的 。大声笑,从这里我收集到the C++ Standard == The Newest Divine Testament
    • 如果您正在编写 C++ 程序,那么,是的。
    • " 对于 C++ 程序,只有 C++ 标准是相关的,它说 int. "。 -1 ,因为显然 C 标准对于 C++ 程序员在实践中同样重要。
    猜你喜欢
    • 2018-03-16
    • 2013-11-04
    • 1970-01-01
    • 2016-07-24
    • 2015-05-23
    • 2023-03-16
    • 2015-05-30
    • 1970-01-01
    相关资源
    最近更新 更多