2013-04-07 204 views
4

我有一個像禁止-Wtautological,比較警告

Q_ASSERT(value_which_is_always_smaller_than_4 < 4) 

其中Q_ASSERT是QTS斷言宏一些代碼。現在鐺,當看到這個警告我時,因爲比較總是如此。不錯,它可以檢測到這一點,但這是assert語句的要點。我可以以某種方式壓制警告,但只能在斷言陳述?我仍然希望在其他地方受到警告。

+1

@JoachimPileborg:OP要在其他地方發出警告。 '-Wnotautological-compare'會在任何地方壓制警告。 – Nawaz 2013-04-07 16:07:38

+0

如果clang可以檢測到這一點,則意味着'value_which_is_always_smaller_than_4'是編譯時常量。在這種情況下,可以使用編譯時斷言(如C++中的static_assert)來斷言它們的值,這肯定比運行時斷言更好。 – Shahbaz 2017-06-16 15:17:17

回答

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打開警告之後)來禁用整個文件。這種方法的缺點是,現在在該翻譯單元中的任何地方都禁用該警告,而不僅僅是對於宏實例。

另外,比較繁瑣,但細粒度的,方法是住宏的每個實例產生與此警告如下:

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

Q_ASSERT(value_which_is_always_smaller_than_4 < 4) 

#pragma clang diagnostic pop