我有一些代码,如下所示:
Q_ASSERT(value_which_is_always_smaller_than_4 < 4)
在这里,Q_ASSERT是Qt的断言宏。现在,当我使用clang编译时会对此发出警告,因为比较始终为真。很好,它可以检测到这一点,但这就是assert语句的重点。我是否可以以某种方式抑制警告,但仅在assert语句中?我仍然希望在其他地方得到警告。
你可以定义一个新的宏来包装 Q_ASSERT
,并使用 #pragma clang diagnostic ignored
自动消除警告:
你可以定义一个新的宏来包装 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)
不应该产生警告。
-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
-Wnotautological-compare
将在所有地方都禁止该警告。 - Nawazvalue_which_is_always_smaller_than_4
是一个编译时常量。在这种情况下,你可以使用编译时断言(例如 C++ 中的static_assert
)对它们的值进行断言,这比运行时断言要好得多。 - Shahbaz