Там в C4172 Визуальное предупреждение C ++ для случаев, когда функция возвращает адрес локальной или временной или ссылку на локальную переменную.
Что-то вроде этого:
int& fun()
{
int var;
return var; //C4172
}
Теперь похоже, что это хорошая идея для использования #pragma warning
заставить Visual C ++ обрабатывать C4172 как ошибку и прерывать компиляцию.
Есть ли нормальные сценарии, в которых C4172 на самом деле не является ошибкой?
Я не уверен, почему кто-то хотел бы сделать это:
int * stackTester()
{
int dummy;
return &dummy;
}
bool stackGoesUp()
{
int dummy;
return stackTester() > &dummy;
}
Но, вообще говоря, вы должны рассматривать предупреждение как ошибку.
Это предупреждение уровня 1, его очень трудно игнорировать. Но компилятор придерживается языковых стандартов, вызывать UB не запрещено. И это очень распространенная ошибка, которая слишком часто заканчивается хорошо. Указанное расположение стека остается стабильным до тех пор, пока вы не выполняете никаких вызовов функций.
Лучший способ справиться с этим — всегда превращать предупреждения в ошибки. Скомпилируйте с параметром / WX, «Обрабатывайте предупреждения как ошибки» в среде IDE. Если вы намеренно хотите подавить предупреждение, тогда предупреждение #pragma дает понять всем, что происходит что-то подозрительное, о чем думали, а не несчастный случай.
Неиспользуемый код
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 }
}