Существуют ли сценарии, в которых предупреждение C4172 Visual C ++ не следует считать ошибкой?

Там в C4172 Визуальное предупреждение C ++ для случаев, когда функция возвращает адрес локальной или временной или ссылку на локальную переменную.

Что-то вроде этого:

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

Теперь похоже, что это хорошая идея для использования #pragma warning заставить Visual C ++ обрабатывать C4172 как ошибку и прерывать компиляцию.

Есть ли нормальные сценарии, в которых C4172 на самом деле не является ошибкой?

11

Решение

Я не уверен, почему кто-то хотел бы сделать это:

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

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

Но, вообще говоря, вы должны рассматривать предупреждение как ошибку.

8

Другие решения

Это предупреждение уровня 1, его очень трудно игнорировать. Но компилятор придерживается языковых стандартов, вызывать UB не запрещено. И это очень распространенная ошибка, которая слишком часто заканчивается хорошо. Указанное расположение стека остается стабильным до тех пор, пока вы не выполняете никаких вызовов функций.

Лучший способ справиться с этим — всегда превращать предупреждения в ошибки. Скомпилируйте с параметром / WX, «Обрабатывайте предупреждения как ошибки» в среде IDE. Если вы намеренно хотите подавить предупреждение, тогда предупреждение #pragma дает понять всем, что происходит что-то подозрительное, о чем думали, а не несчастный случай.

4

Неиспользуемый код

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 }
}
0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector