是否有任何情况下C4172 Visual C ++警告不应被视为错误?

时间:2013-02-04 15:45:41

标签: c++ visual-c++ compiler-warnings

当函数返回本地或临时地址或对局部变量的引用时,会出现C4172 Visual C ++警告。

这样的事情:

int& fun()
{
    int var;
    return var; //C4172
}

现在看来使用#pragma warning使Visual C ++将C4172视为错误并中断编译是个好主意。

是否存在C4172实际上不是错误的理智场景?

3 个答案:

答案 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 }
}