【发布时间】:2010-12-09 06:19:21
【问题描述】:
自从我多年前意识到,默认情况下这不会产生错误(至少在 GCC 中),我一直想知道为什么?
我知道您可以发出编译器标志来产生警告,但它不应该总是错误吗?为什么非 void 函数没有返回值是有效的?
cmets 中要求的示例:
#include <stdio.h>
int stringSize()
{
}
int main()
{
char cstring[5];
printf( "the last char is: %c\n", cstring[stringSize()-1] );
return 0;
}
...编译。
【问题讨论】:
-
另外,我将所有警告都视为错误,无论多么微不足道,并且我会激活所有警告(如有必要,可以在本地停用......但在代码中很清楚为什么)。
-
-Werror=return-type只会将该警告视为错误。我只是忽略了警告,而在追踪无效this指针时的几分钟的挫败感将我带到了这里并得出了这个结论。 -
更糟糕的是,从
std::optional函数的末尾流出而不返回返回一个“真”可选 -
@Rufus 没必要。这正是你的机器/编译器/操作系统/月球周期发生的事情。由于未定义的行为,编译器生成的任何垃圾代码只是碰巧看起来像一个“真正的”可选,不管那是什么。
-
С++2003, 6.6.3 2:“从函数末尾流出相当于没有值的返回;这会导致返回值的函数出现未定义的行为”