我有一些代码像
Q_ASSERT(value_which_is_always_smaller_than_4 < 4)
其中Q_ASSERT是qt的断言宏。当看到这个的时候,clang提醒了我,因为这个比较总是正确的。很好,它可以检测到这一点,但这就是assert语句的意义。我能否以某种方式抑制警告,但仅在断言语句中?我还是希望在其他地方得到警告。
您可以定义一个新的宏来包装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)
不应该产生警告。
您可以通过在Clang命令行中添加-Wno-tautological-compare
来禁用整个文件(在-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