13

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

像这样的东西:

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

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

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

4

3 回答 3

9

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

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

bool stackGoesUp()
{
    int dummy;
    return stackTester() > &dummy;
}

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

于 2013-02-04T15:53:46.743 回答
6

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

处理这个问题的最好方法是始终将警告变成错误。使用 /WX 编译,IDE 中的“将警告视为错误”设置。如果您随后有意抑制警告,那么#pragma 警告会向所有人清楚地表明正在发生的一些可疑的事情是经过深思熟虑的,而不是意外。

于 2013-02-04T16:32:14.430 回答
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 }
}
于 2014-04-04T16:27:26.340 回答