Это скорее вопрос удобства, чем что-либо другое, но я хотел бы знать, могу ли я как-то подавить предупреждение:
управление может достигать конца не пустой функции [-Wreturn-type]
для конкретных случаев, когда я знать что нет проблем с кодом. У меня есть несколько вспомогательных функций в моей кодовой базе для создания исключений и для кода, подобного этому:
int foo(int i) {
if (i > 10) {
return i*10;
}
else {
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
}
}
Я знаю, что он либо вернется, либо выбросит, несмотря ни на что. Таким образом, предупреждение, на мой взгляд, совершенно бесполезно, просто компилятор не может определить, что путь потока управления на самом деле закончится.
Я все еще хотел бы видеть это всплывающее предупреждение для случаев, когда это фактически признак того, что код неправильный (то есть с путем, который не возвращает или бросает).
Это было бы возможно портативным способом?
РЕДАКТИРОВАТЬ: Забыл добавить компилятор, который я использую,
Apple LLVM версия 8.1.0 (clang-802.0.41)
Компилятор не может понять, что Exception::throwExcept()
не вернется. Здесь есть два решения. Один из них — сообщить компилятору, что
struct Exception
{
[[noreturn]] static void throwExcept(SomeType const&);
};
(лязг-х -Wmissing-noreturn
, который входит в -Weverything
, предупредит, если вышеуказанная функция может быть объявлена [[noreturn]]
но не) или переставить функцию как
int foo(int i) {
if (!(i>10))
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
return i*10;
}
Маркировка Exception::throwExcept
функция [[noreturn]]
должен помочь компилятору выяснить, что он на самом деле не вернется.
Быстрый и грязный способ устранить ошибку — использовать оператор запятой в операторе возврата. Если вы используете
return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0;
Компилятор увидит оператор return, но фактически никогда не выполнится как
Exception::throwExcept(MyCustomException("Error: i not in the accepted range"))
Скинет прежде, чем сможет вернуть 0.
Мне кажется, что ваш компилятор не может видеть внутри Exception::throwExcept
знать, что это всегда выбрасывает исключение.
Помогите компилятору с необработанным исключением C ++ throw
как последняя строка вашей функции: throw std::exception("Just to help the compiler know to not warn here");
Это не повредит производительности, так как код никогда не будет выполнен.