对于不返回void的C++函数,必须使用return语句吗?

Alw*_*ing 19 c++

我的Herb Schildt关于C++的书说:"......在C++中,如果函数被声明为返回一个值,它必须返回一个值." 但是,如果我编写一个非void返回类型的函数并且不返回任何内容,则编译器会发出警告而不是错误:"控件到达非void函数的结尾".

我使用gcc(MinGW)并设置了-pedantic标志.

GMa*_*ckG 27

§6.6.3/ 2:

流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.

所以这取决于你对强制性的定义.你吗?不.但是,如果您希望您的程序具有明确定义的行为,是的.*

*main是一个例外,见§3.6.1/ 5.如果控制到达main没有a 的结束return,它将具有的效果return 0;.

  • 未定义的行为比崩溃更糟糕. (4认同)
  • @Jurily:我同意,但我不知道这与这里的任何事情有什么关系. (2认同)
  • 请注意以下措辞:它适用于执行,不适用于编译。如果您输入的函数的返回类型不是“ void”,并且没有结束,那么就不需要“ return”来避免未定义的行为。 (2认同)

lio*_*ori 10

它是强制性的 - 当这样的函数结束而没有返回任何东西时它是一个未定义的行为(因此编译器实际上可能实现某种特殊行为).但是,有一些特殊情况.

::main是一个例外,假设它return 0;在代码的末尾.

此外,您不必在不能完全返回的函数中返回值,fe:

int Foo() {
    throw 42;
}
Run Code Online (Sandbox Code Playgroud)

  • 例外情况可能就是为什么这只是一个警告.编译器不太了解实际使用哪些控制路径,并且错误会导致许多完美的代码被拒绝. (3认同)

CB *_*ley 6

在声明为返回非void的函数中使用return语句并不是必须的,并且它不必导致未定义的行为.

这样的功能可以:

  • 通过进入无限循环说不回来
  • 通过抛出异常返回
  • 调用一个本身不返回的函数,例如 std::terminate

当然,如果函数通过始终执行上述操作之一来避免未定义的行为,则可能不应将其声明为返回非void(如果可能).

需要的一个明显情况是,如果它是一个虚函数,对于类层次结构中的特定点,它不能返回有效值并始终通过异常退出.


Tom*_*Tom 4

是的,它必须返回一个值。

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

这个问题将为这个主题带来更多的启发