2013-04-07 3 views
4

У меня есть некоторый код, какПодавить -Wtautological Сравните предупреждение

Q_ASSERT(value_which_is_always_smaller_than_4 < 4) 

где Q_ASSERT является QTs Assert макроса. Теперь clang, видя это, предупреждает меня об этом, потому что сравнение всегда верно. Приятно, что это может обнаружить это, но это точка утверждения assert. Могу ли я как-то подавить предупреждение, но только в утверждениях? Мне все равно нравилось, когда меня предупреждали в других местах.

+1

@JoachimPileborg: OP хочет предупреждение в других местах. '-Wnotautological-compare' будет подавлять предупреждение повсюду. – Nawaz

+0

Если clang может обнаружить это, это означает, что значение value_which_is_always_smaller_than_4 является константой времени компиляции. В этом случае вы можете использовать утверждения времени компиляции (например, 'static_assert' в C++) для утверждения по их значению, что, безусловно, лучше, чем утверждение времени исполнения. – Shahbaz

ответ

10

Вы можете определить новый макрос, чтобы обернуть Q_ASSERT и автоматически отключить предупреждение используя #pragma clang diagnostic ignored:

#define STR(x) #x 
#define PRAGMA(x) _Pragma(STR(x)) 
#define MY_ASSERT(x) PRAGMA(clang diagnostic push) \ 
PRAGMA(clang diagnostic ignored "-Wtautological-compare") \ 
Q_ASSERT(x) \ 
PRAGMA(clang diagnostic pop) 

Теперь просто делает

MY_ASSERT(3<4) 

не должен выдавать предупреждение.

2

Вы можете отключить его для всего файла, добавив -Wno-tautological-compare в командную строку Clang (после флагов, таких как -Wall, которые включают предупреждения). Недостатком этого метода является то, что предупреждение теперь отключено повсюду в этом блоке перевода, а не только для экземпляров макроса Q_ASSERT(...).

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

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wtautological-compare" 

Q_ASSERT(value_which_is_always_smaller_than_4 < 4) 

#pragma clang diagnostic pop 
Смежные вопросы