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

sha*_*oth 11 c++ compiler-warnings visual-c++

C4172的Visual C++为当函数返回一个局部性或暂时或局部变量的引用的地址的情况下报警.

像这样的东西:

int& fun()
{
    int var;
    return var; //C4172
}
Run Code Online (Sandbox Code Playgroud)

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

是否有任何理智的情况C4172实际上不是一个错误?

Iro*_*san 8

我不确定为什么有人会这样做:

int * stackTester()
{
    int dummy;
    return &dummy;
}

bool stackGoesUp()
{
    int dummy;
    return stackTester() > &dummy;
}
Run Code Online (Sandbox Code Playgroud)

但一般来说,您应该将警告视为错误.

  • 如果我理解C标准,将指针与>,<,> =和<=进行比较会导致未定义的行为,如果这些指针不指向同一个聚合对象(struct/union)或同一个数组的元素(包括非最后一个之后存在的元素).我认为C++在这里是一样的. (4认同)

Han*_*ant 6

这是 1 级警告,很难忽​​视。但是这里的编译器遵循语言标准,不禁止调用 UB。这是一个非常常见的错误,而且往往会以好的方式结束。只要您不进行任何函数调用,指向的堆栈位置就会保持稳定。

解决这个问题的最好方法是始终将警告转化为错误。使用 /WX 编译,IDE 中的“将警告视为错误”设置。如果您然后故意想要抑制警告,那么#pragma warning 会向每个人清楚表明正在发生的可疑事件是经过深思熟虑的,而不是意外事件。