2014-02-19 23 views
4

这里是一个C++函数:当一个函数缺少返回值时,编译器会生成一个警告但不会出错?

int FuncWithoutReturn() 
{ 
    int var = 10; 
    ++var; 
    // No return value here !!! 
} 

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

error C4716: 'FuncWithoutReturn' : must return a value.

但是XCode中5,编译器只是吐出一个警告:

Control reaches end of non-void function

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

只是想知道任何人都知道为什么XCode认为这是一个警告,而不是一个错误。

+0

感谢您的回答,但有没有任何情况下缺少返回值是故意的?我的意思是我的情况,那是一个错误。但是因为编译器认为这个错误是默认的警告。我认为必须有一个原因,为什么... – r0ng

回答

5

你可以用-Werror=return-type来做出这个警告和错误,在我原来的评论中我忘了那个。你可以看到它live

这是clanggcc的一个选项,据我了解XCode可以使用任一个。

[...]Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

未定义行为不要求:

降降值返回函数是undefined behavior末,我们可以通过转到draft C++ standard6.6.3return语句款它说看到这一个诊断(警告或错误),尽管在很多情况下编译器会提供一个。

+0

标准,是的,这是我想知道的。谢谢。 – r0ng

2

可以使用-Werror=return-type

Just wondering anyone knows WHY XCode think it is a warning instead of an error.

检查项目/目标的/ xcconfig的设置为 “不匹配的返回类型”(又名GCC_WARN_ABOUT_RETURN_TYPE)启用它。

1

只为我的卑微的历史,这只是我的历史。

g ++ 4.9.2创建.o文件,在没有返回语句的情况下运行良好。
铛++ 3.5的.o与警告文件生成:“警告:控制到达非void函数的端[-Wreturn型]”

但在我的情况下:用铛生成

  • 二进制++在运行时崩溃;

  • 用g ++生成的二进制文件在运行时不会崩溃;

我明白,这是一个未定义的行为,你必须把return语句,但在铛++的情况下,我希望他们会修改这个“警告”的“错误”,以帮助人们移植他们的代码和同时清理它。

我有很多其他的警告与铿锵++这是好的,但这似乎是一个不仅仅是一个警告。
将代码移植到clang ++,在这种情况下,对于像我这样的人来说更多的工作,我不知道生成的代码会因为这个警告而被破坏,因为基本上,它在许多g ++编译器上工作正常。

相关问题