当函数返回本地或临时地址或对局部变量的引用时,会出现C4172 Visual C ++警告。
这样的事情:
int& fun()
{
int var;
return var; //C4172
}
现在看来使用#pragma warning
使Visual C ++将C4172视为错误并中断编译是个好主意。
是否存在C4172实际上不是错误的理智场景?
答案 0 :(得分:8)
我不确定为什么有人会想要这样做:
int * stackTester()
{
int dummy;
return &dummy;
}
bool stackGoesUp()
{
int dummy;
return stackTester() > &dummy;
}
但一般来说,您应该将警告视为错误。
答案 1 :(得分:4)
这是一级警告,很难忽视。但是编译器遵循这里的语言标准,不禁止调用UB。这是一个非常常见的错误,往往会达到一个好的结果。只要您不进行任何函数调用,指向堆栈的位置就会保持稳定。
处理此问题的最佳方法是始终将警告变为错误。使用/ WX编译,在IDE中将“将警告视为错误”设置。如果你故意想要压制一个警告,那么#pragma warning会让每个人都清楚地知道有什么可疑的事情,而不是意外事故。
答案 2 :(得分:0)
未使用的代码
class base
{
virtual blah& makeBlah()
}
class red : public base
{
blah& makeBlah() { return blah(); } // there are no red blahs, never called
}
class blue : public base
{
blah& makeBlah() { actual code to make a blah }
}