抑制 -Wtautological-compare 警告

7

我有一些代码,如下所示:

Q_ASSERT(value_which_is_always_smaller_than_4 < 4)

在这里,Q_ASSERT是Qt的断言宏。现在,当我使用clang编译时会对此发出警告,因为比较始终为真。很好,它可以检测到这一点,但这就是assert语句的重点。我是否可以以某种方式抑制警告,但仅在assert语句中?我仍然希望在其他地方得到警告。


1
@JoachimPileborg:OP希望在其他地方看到警告。-Wnotautological-compare将在所有地方都禁止该警告。 - Nawaz
3
如果 clang 能够检测到这个,那么就意味着 value_which_is_always_smaller_than_4 是一个编译时常量。在这种情况下,你可以使用编译时断言(例如 C++ 中的 static_assert)对它们的值进行断言,这比运行时断言要好得多。 - Shahbaz
-Wno-tautological-compare - tangkk
2个回答

13

你可以定义一个新的宏来包装 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)

不应该产生警告。


5
您可以通过在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

1
命令行标志“-Wno-tautological-constant-compare”也可以分配给“CFLAGS”或“CXXFLAGS”,如果有人使用GNU autotools。 - alijandro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接