当函数缺少返回值时,编译器会生成警告但不会出错?

r0n*_*0ng 8 c++ function xcode5

这是一个c ++函数:

int FuncWithoutReturn()
{
  int var = 10;
  ++var;
  // No return value here !!!
}
Run Code Online (Sandbox Code Playgroud)

在MSVC中,编译器生成错误:

错误C4716:'FuncWithoutReturn':必须返回一个值.

但在XCode 5中,编译器只是发出警告:

控制到达非空函数的结束

在运行时,如果我很幸运,应用程序崩溃.我知道这是一个愚蠢的错误,但编译器首先产生错误会很好.

只是想知道为什么XCode认为这是一个警告而不是错误.

Sha*_*our 8

你可以用-Werror=return-type我做的那个警告和错误,在我原来的评论中我忘记了.你可以看到现场.

这是clanggcc中的一个选项,据我所知,XCode可以使用其中任何一个.

退出值返回函数的末尾是未定义的行为,我们可以通过转到草案C++标准部分看到这一点6.6.3 .返回语句2段说:

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

未定义的行为不需要诊断(警告或错误),但在许多情况下编译器将提供一个.