对于不返回 void 的 C++ 函数,是不是必须使用 return 语句?
Posted
技术标签:
【中文标题】对于不返回 void 的 C++ 函数,是不是必须使用 return 语句?【英文标题】:Is a return statement mandatory for C++ functions that do not return void?对于不返回 void 的 C++ 函数,是否必须使用 return 语句? 【发布时间】:2010-05-06 20:04:05 【问题描述】:我的 Herb Schildt 关于 C++ 的书说:“......在 C++ 中,如果一个函数被声明为返回一个值,它必须返回一个值。”但是,如果我编写了一个具有非 void 返回类型的函数并且不返回任何内容,编译器会发出警告而不是错误:“控制到达非 void 函数的结尾。”
我使用 gcc (MinGW) 并设置了 -pedantic 标志。
【问题讨论】:
听说 Herb Schildt 的书不好。 是的,这是强制性的。另外,考虑买一本更好的书。 Schildt 的大部分书通常被认为是糟糕的。 这就是我用-Werror
编译的原因……
相关:***.com/questions/1610030/…
显然 -Werror 不是这里的解决方案。
【参考方案1】:
§6.6.3/2:
从函数的末尾流出相当于没有值的返回;这会在返回值的函数中导致未定义的行为。
所以这取决于您对强制性的定义。你有吗?不,但是如果您希望您的程序具有明确定义的行为,可以。*
*main
是一个例外,请参阅第 3.6.1/5 节。如果控制在没有return
的情况下到达main
的末尾,它将具有return 0;
的效果。
【讨论】:
未定义的行为比崩溃要糟糕得多。 @Jurily:我同意,但我不明白这与这里的任何事情有什么关系。 注意措辞:它适用于执行,而不是编译。如果你输入一个返回类型不是void
的函数,并且没有结束,你不需要return
来避免未定义的行为。
@Jurily,真的吗?未定义的行为可能意味着它决定格式化您的硬盘驱动器,向您的老板发送儿童色情内容的垃圾邮件,并在电子邮件中抄送 FBI。未定义的行为意味着它可以在那之后做任何事情,直到、包括,甚至超过一个彻头彻尾的混蛋。你最好失败到一个已知的状态。至少如果它崩溃了,我知道它已经停止做坏事了。【参考方案2】:
这是强制性的——当这样的函数结束而不返回任何东西时,这是一种未定义的行为(因此编译器实际上可能会实现某种特殊行为)。但是,也有一些特殊情况。
::main
是一个例外,假设return 0;
在其代码的末尾。
另外,你不必在一个不能干净返回的函数中返回一个值,例如:
int Foo()
throw 42;
【讨论】:
异常示例可能就是为什么这只是一个警告。编译器不太擅长知道实际使用了哪些控制路径,一个错误会导致很多非常好的代码被拒绝。 @DennisZickefoose - 它“只是一个警告”,因为从函数返回的行为从末尾脱落会给出未定义的行为(main()
除外)。当行为未定义时不需要诊断(尽管编译器可能会选择发出警告 - 这是实现问题的质量,而不是标准的要求)。无论如何,还有很多其他情况,编译器无法可靠地选择哪些控制路径被使用或未被使用。【参考方案3】:
在声明为返回非 void 的函数中包含 return 语句不是强制性的,也不必导致未定义的行为。
这样的功能可以:
不返回,比如进入无限循环 抛出异常返回 调用本身不返回的函数,如std::terminate
当然,如果函数通过始终执行上述任一操作来避免未定义的行为,则可能不应该将其声明为返回非 void。
需要这样做的一个明显情况是,如果它是一个虚函数,对于类层次结构中的特定点,它不能返回有效值并且总是通过异常退出。
【讨论】:
【参考方案4】:是的,它必须返回一个值。
从函数的末尾流出的是 相当于没有价值的回报; 这会导致未定义的行为 一个值返回函数。
This question 会给主题带来更多亮点
【讨论】:
非常感谢。我现在把它看作是一个哲学细节。标准中的“必须”意味着“必须,否则将出现未知行为”。【参考方案5】:这是强制性的吗?我不这么认为,但是根据我对 c++ 标准的理解,未定义在非 void 返回函数中返回值(main 除外,它返回 0)。
这是否意味着没问题?可能不会 - 如果函数应该返回一个值,您应该返回一个值,这在复杂的代码库中可能会变得非常混乱。
【讨论】:
【参考方案6】:忘记在值返回函数的某些控制路径中包含return
语句不会使您的代码格式错误。 IE。您通常应该期望代码能够编译(可能带有警告)。从这个意义上说,它不是“强制性的”。
然而,实际上在 C++ 中从返回值函数的末尾流出总是未定义的行为。 (在 C 中,只有当调用代码实际使用结果时,它才是未定义的行为。)
【讨论】:
C++ 标准允许控制在没有return
语句的情况下离开main()
- 在这种情况下,该行为得到了很好的定义。【参考方案7】:
就像 GMan 所说的,唯一的例外是 main 函数。我仍然看到大量书籍在 main 中返回 0,这并不是真正必要的。哦,好吧,我想它可能会更糟,你可以从一本使用 void main() 而不是 int main() 的书中学习。 但我认为你应该从这一切中学到的是你的编译器抱怨是有原因的,你注意到它是件好事,因为从长远来看它通常会让你头疼。
【讨论】:
以上是关于对于不返回 void 的 C++ 函数,是不是必须使用 return 语句?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 std::fstream 返回 void 而不是 bool