Я использую MSVC 16 2019 со многими включенными предупреждениями, включая C4127: условное выражение является постоянным. Однако у меня есть код, который выглядит так:
template <bool B>
void foo(int x) {
if (B && x == 0) { do_stuff(); }
do_other_stuff();
}
... и предупреждение срабатывает, когда B ложно.
Я хочу сохранить эту ошибку в целом, но не хочу, чтобы она необоснованно предупреждала, когда постоянство выражения условия обусловлено только созданием экземпляра шаблона.
Примечание: Этот вопрос связан, но код не будет (существенно) меняться, так что я спрашиваю не об этом. И не в C++17.
@NathanOliver: Сделайте это ответом?
Используйте if constexpr (B) if (x == 0) { do_stuff(); }
@273K: Да, это будет работать с C++17 (который я не могу использовать).
@einpoklum Если вы используете только MSVC, он не поддерживает C++11 и поддерживает if constexpr
как расширение в режиме C++14. Это также предотвращает ошибку компилятора, если у вас есть только if (B) if (x == 0) { do_stuff(); }
(без if constexpr: godbolt.org/z/Wbo767sEK )
@Artyer: Я сам никогда не использую MSVC, но некоторые пользователи моей библиотеки используют...
Вы можете переформатировать функцию в
template <bool B>
void foo(int x) {
// Doing this to remove B triggering a constant condition warning when B is false
// future: replace with if constexpr in C++17+
bool b = B;
if (b && x == 0) { do_stuff(); }
do_other_stuff();
}
and now b
не является постоянным выражением, поэтому предупреждение больше не применяется.
@ThomasWeller И именно поэтому комментарии к коду важны. ОП говорит, что они не могут использовать C++17, так что if constexpr
пока не поможет.
(вздох) Я могу это сделать, но я все равно буду чувствовать себя дураком, которого компилятор водит за нос.
@einpoklum: это будет не единственный раз. Компиляторы могли бы быть намного умнее, особенно с шаблонами. Думаю, нам придется подождать.
Вы можете временно отключить предупреждение для этого блока кода с помощью директивы #pragma, как предлагает Марк Рэнсом.
template <bool B>
void foo(int x) {
#pragma warning(disable:4127)
if (B && x == 0) { do_stuff(); }
#pragma warning(default:4127)
do_other_stuff();
}
Видеть: https://learn.microsoft.com/en-us/cpp/preprocessor/warning?view=msvc-170
Вместо #pragma alert(disable, )/#pragma alert(default, ) я предлагаю вам использовать #pragma alert(suppress, ), если в данной функции есть только одна строка, которая должна вызвать предупреждение. Подавление отключает предупреждение только для следующей строки.
Вы можете использовать
#pragma
, чтобы отключить отдельные предупреждения и восстановить их снова после нарушающего блока кода.