Могу ли я сделать MSVC менее строгим в отношении «C4127: условное выражение является постоянным»

Я использую MSVC 16 2019 со многими включенными предупреждениями, включая C4127: условное выражение является постоянным. Однако у меня есть код, который выглядит так:

template <bool B>
void foo(int x) {
    if (B && x == 0) { do_stuff(); }
    do_other_stuff();
}

... и предупреждение срабатывает, когда B ложно.

Я хочу сохранить эту ошибку в целом, но не хочу, чтобы она необоснованно предупреждала, когда постоянство выражения условия обусловлено только созданием экземпляра шаблона.

Примечание: Этот вопрос связан, но код не будет (существенно) меняться, так что я спрашиваю не об этом. И не в C++17.

Вы можете использовать #pragma, чтобы отключить отдельные предупреждения и восстановить их снова после нарушающего блока кода.

Mark Ransom 01.03.2024 16:56

@NathanOliver: Сделайте это ответом?

einpoklum 01.03.2024 16:59

Используйте if constexpr (B) if (x == 0) { do_stuff(); }

3CxEZiVlQ 01.03.2024 16:59

@273K: Да, это будет работать с C++17 (который я не могу использовать).

einpoklum 01.03.2024 17:22

@einpoklum Если вы используете только MSVC, он не поддерживает C++11 и поддерживает if constexpr как расширение в режиме C++14. Это также предотвращает ошибку компилятора, если у вас есть только if (B) if (x == 0) { do_stuff(); } (без if constexpr: godbolt.org/z/Wbo767sEK )

Artyer 01.03.2024 20:01

@Artyer: Я сам никогда не использую MSVC, но некоторые пользователи моей библиотеки используют...

einpoklum 02.03.2024 09:33
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
6
133
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете переформатировать функцию в

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 пока не поможет.

NathanOliver 01.03.2024 17:14

(вздох) Я могу это сделать, но я все равно буду чувствовать себя дураком, которого компилятор водит за нос.

einpoklum 01.03.2024 17:21

@einpoklum: это будет не единственный раз. Компиляторы могли бы быть намного умнее, особенно с шаблонами. Думаю, нам придется подождать.

Thomas Weller 01.03.2024 17:23

Вы можете временно отключить предупреждение для этого блока кода с помощью директивы #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, ), если в данной функции есть только одна строка, которая должна вызвать предупреждение. Подавление отключает предупреждение только для следующей строки.

SoronelHaetir 01.03.2024 20:55

Другие вопросы по теме