13

関数がローカル変数または一時変数のアドレス、またはローカル変数への参照を返す場合、C4172 Visual C++ 警告があります。

このようなもの:

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

#pragma warningVisual 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 の呼び出しは禁止されていません。そして、それは非常によくあるバグであり、あまりにも多くの場合、良い結果をもたらします。関数呼び出しを行わない限り、指定されたスタックの場所は安定したままです。

これに対処する最善の方法は、常に警告をエラーに変えることです。IDE で /WX、「警告をエラーとして扱う」設定でコンパイルします。意図的に警告を抑制したい場合は、 #pragma warning を使用すると、事故ではなく考えられた怪しいことが起こっていることが誰にでもわかります。

于 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 に答える