Подтвердить что ты не робот

Как легко устранить бессмысленные предупреждения компилятора С++?

Этот вопрос не связан с каким-либо конкретным предупреждением о компиляторе, ниже приведен пример.

В настоящее время, когда мне нужен цикл, который проверяет условие выхода внутри:

 while( true ) {
    doSomething();
    if( condition() ) {
       break;
    }
    doSomethingElse();
}

Я не могу просто написать это в Visual С++ - он выдает предупреждение C4127 conditional expression is constant. Компилятор будет махать им по лицу, хотя совершенно очевидно, что while(true) не может быть написано случайно.

Предположим, что мне нужен код, который компилируется без предупреждений. На моем сервисе есть обходные пути.

Обходной путь - использовать for(;;), но он кажется глупым - зачем мне эта странная вещь, а не краткая элегантная идиоматическая while(true)? Обходной путь 2 заключается в использовании #pragma warning( suppress) до строки while( true ), но он добавляет огромный баннер, который в два раза больше, чем сам while -statement. Обходной путь три - отключить C4127 для всего проекта (я видел это в реальном проекте), но тогда все возможные полезные примеры C4127 также отключены.

Есть ли элегантный способ избавиться от бессмысленного предупреждения?

4b9b3361

Ответ 1

Я бы написал for(;;), потому что этот идиоматический.

Более новые версии Visual С++ не такие же идиотские, как и предыдущие версии. предупреждения. Visual С++ 10.0 компилирует код, который использует <windows.h>, на уровне предупреждения 4, никаких предупреждений.

Но если вы хотите отключить скрытые версии Visual С++, посмотрите мой старый заголовок anti-sillywarnings, который был создан с помощью ввода из сообщество [comp.lang.С++].

Ответ 2

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

Мне кажется более логичным, чем использование цикла while и тестирование того, что true по-прежнему истинно каждый раз за цикл (конечно, компилятор будет оптимизировать этот тест, поэтому он фактически не повлияет на производительность).

Ответ 3

Что может быть - реалистично реализуемо - более элегантно, что одна строка:

 #pragma warning ( suppress : 4127 )

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

Конечно, для вашего случая for(;;) может быть прагматичный подход, но в целом

Как легко преодолеть бессмысленные предупреждения компилятора С++?

Я бы сказал отключить их проект в целом. (в конце концов, бессмысленно). И, чтобы изменить

Как преодолеть false-positve предупреждения компилятора С++ изящно?

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

Ответ 4

Моя философия заключается в том, что если вы заставите компилятор подавлять предупреждения, поставьте там комментарий и скажите почему. Даже если вы считаете это глупым. Прагма выделяется и видна. Это прекрасный комментарий в вашем коде.

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

Btw, вы ищете способ подавления предупреждений без

  • Использовать прагма
  • Используйте уродливый код
  • Использовать полное подавление проекта

Это будет очень скрытый метод подавления.

Если вам не нравится внешний вид прагмы, используйте

bool alwaysTrue = true; // to prevent compiler warning C4127
while (alwaysTrue) {
    ...
}

Ответ 5

Я использую while (true, 1) для подавления этого предупреждения.

Ответ 6

Сделайте несколько смешных вставок в токен: если вы можете поменять

while(true)

для

while(true)

то просто выполните следующее:

#define while_true for( ;; )
#define While(a) while_##a

Ответ 7

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

Пример цикла из вопроса можно записать следующим образом:

for (; testExitCondition();) 
  doSomething();

В более сложных случаях счетчик циклов может использоваться как состояние конечного автомата (каждое действие требуется для обновления состояния):

for (int state = stateBegin; state == stateTerminate;) 
{
  switch (state) 
  {
    case stateBegin:
      //elaborate setup
      break;
    case state_1: 
      doSomething_1();
      break;
    case state_2: 
      doSomething_2();
      break;
    case state_n: 
      doSomething_n();
      break;
}

Мой любимый способ избежать бессмысленных предупреждений на С++ - использовать С#:)

По общему признанию, это вызывает множество бессмысленных предупреждений С#, но ничего идеального.

Гоша, посмотри на отрицательные голоса. Доказательство того, что С++ наносит ущерб вашему чувству юмора.