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