My Herb Schildt关于C ++的书说:“......在C ++中,如果函数被声明为返回一个值,那么必须返回一个值。”但是,如果我编写一个具有非void返回类型的函数并且不返回任何内容,则编译器会发出警告而不是错误:“控件到达非void函数的结尾。”
我使用gcc(MinGW)并设置了-pedantic标志。
答案 0 :(得分:28)
§6.6.3/ 2:
离开函数末尾相当于没有值的返回;这会导致值返回函数中的未定义行为。
所以这取决于你对强制性的定义。你有吗?不。但是,如果您希望您的程序具有明确定义的行为,是的。*
* main
是一个例外,见§3.6.1/ 5。如果控件在没有main
的情况下到达return
的末尾,则会产生return 0;
的效果。
答案 1 :(得分:10)
这是强制性的 - 当这样的函数结束而没有返回任何东西时它是一个未定义的行为(因此编译器实际上可能实现某种特殊行为)。但是,有一些特殊情况。
::main
是一个例外,假设return 0;
位于代码的末尾。
此外,您不必在不能完全返回的函数中返回值,例如:
int Foo() {
throw 42;
}
答案 2 :(得分:6)
在声明为返回非void的函数中有一个return语句并不是必须的,它不一定会导致未定义的行为。
这样的功能可以:
std::terminate
当然,如果函数通过始终执行上述操作之一来避免未定义的行为,则可能不应将其声明为返回非void(如果可能)。
它需要的一个明显情况是,如果它是一个虚函数,对于类层次结构中的特定点,它不能返回有效值并始终通过异常退出。
答案 3 :(得分:4)
答案 4 :(得分:1)
是强制性的吗?我不相信,但是根据我对c ++标准的理解,未在非void返回函数中返回值是未定义的(除了main,它返回0)。
这是否意味着它没问题?可能不是 - 如果函数应该返回一个值,你应该返回一个,这可能会在复杂的代码库中变得非常混乱。
答案 5 :(得分:1)
忘记在值返回函数的某个控制路径中包含return
语句不会使您的代码格式错误。即您通常应该期望编译代码(可能带有警告)。从这个意义上讲,它不是“强制性的”。
然而,实际上在C ++中流出值返回函数的结尾总是未定义的行为。 (在C中,只有当调用代码实际使用结果时,它才是未定义的行为。)
答案 6 :(得分:0)
与GMan一样,唯一的例外是主要功能。我仍然看到大量的书籍在主要版本中返回0,这是不必要的。哦,我想这可能会更糟,你可以从一本使用void main()而不是int main()的书中学习。 但我认为你应该从中学到的是你的编译器抱怨有一个原因而且你注意到它很好,因为从长远来看它通常会让你头疼。