【问题标题】:Returning a value on function exit in C++ [closed]在 C++ 中返回函数退出的值 [关闭]
【发布时间】:2016-08-18 19:46:51
【问题描述】:

在 C++ 中main () 是否不需要包含return 0;

它是仅适用于main 还是适用于任何非 void 函数?

它是 C++11 中的新功能还是一直都是这样?

原理是什么?

【问题讨论】:

  • "不需要" != "不应该"
  • 一直都在用,到底是什么意思? main() 没有必要这样做。
  • 由你决定,它是可选的。
  • 那么,如果不是required,我为什么要包含它?只是好奇。
  • @Aconcagua 是的,不允许:eel.is/c++draft/basic.start.main#3

标签: c++ c++11 iso


【解决方案1】:

如果您没有显式返回值,main() 函数保证返回 0。这是在 ISO 标准中定义的:

3.6.1/5:main 中的return 语句具有离开main 函数的效果(销毁任何具有自动存储持续时间的对象)和 以返回值作为参数调用std::exit。如果控制 在没有遇到 return 语句的情况下到达 main 的末尾, 效果就是执行

return 0;

这种特殊行为只针对main(),因为main()是一个返回int的函数,标准定义了一般规则:

6.6.3/2 从函数末尾流出相当于没有值的返回;这会导致未定义的行为 值返回函数。

现在,总是这样吗? C++ 编程语言中的 Bjarne Stroutsturp 在其 1986 年的版本中,早在任何标准化之前就提出了这一点。在他的教程章节的大多数示例中,main() 没有返回值,在这个早期版本的第 82 页上,他说:

按照惯例,如果程序正常终止,main() 会返回 0 否则非零,因此返回错误数 很好地做到了这一点

补充说明

然而,在本书中,该规则在示例和随附的解释中是隐含的; Stroustrup 没有明确说明 main() 的一般明确规则,他也没有在 1994 年的The Design and evolution of C++一书中提到它。

需要注意的是,在 C89 中,原则仍然是在没有显式返回值的情况下未定义的行为,直到 C99 到来。但是在 C++98 中,当前默认返回 0 的规则已经被形式化了。所以我认为这不是为了向后兼容 C。

【讨论】:

    【解决方案2】:

    在 C++ 中main () 是否不需要包含return 0;

    是的。

    它是仅适用于 main 函数还是适用于任何非 void 函数?

    仅适用于main()

    它是 C++11 中的新功能还是一直都是这样?

    不,一直都是这样。

    原理是什么?

    语言的向后兼容性(以及与 C 的兼容性)很可能。

    【讨论】:

    • 你的意思是向后兼容 C++98 吗?
    • @m.rossi 我的意思是关于 C 方言。
    • 肯定与标准 C 不兼容。隐式 return 0 是在 C99 中添加的(我认为),这比 C++ 的标准化要晚得多。我想在这种情况下影响是相反的(或者源影响可能是共享的——比如一个常见的编译器扩展,它比 C 更早地变成了 C++)。
    • 是/曾经是 C 中的 void main 标准吗?如果是这样,可能已经将 C 代码更改为 C++,但只需将 void 更改为 int
    • @NathanOliver 从来没有。它是 MSVC 编译器的扩展。
    【解决方案3】:

    [basic.start.main]/5(强调我的):

    main中的return语句具有离开main函数的效果 (销毁任何具有自动存储持续时间的对象)并调用 std::exit 以返回值作为参数。 如果控制流出 main 的复合语句结束,效果等价于 操作数为 0 的返回(另见 [except.handle])。

    它似乎一直存在于 C++ 标准中(就此而言,也存在于 C 中,从 C99 开始 - 参见 C99 规范 §5.1.2.2.3)。

    它仅适用于main() 函数。

    我不知道最初的理由。它可能是“帮助开发人员避免在 main() 末尾键入 return 0;”。

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多