在Clang中禁用特定警告实例的简明方法

时间:2018-01-24 15:51:15

标签: c++ clang

假设我的代码中有一些警告,例如Clang已经为结构添加了填充。我找到了那个特定的实例,我想把它标记为“Noted;不要再警告我这个实例了。”

有没有办法做到这一点并不是非常冗长(即#pragma clang diagnostic push等)?理想情况下,就像警告在同一行上的注释,如下所示:

// clang(-Wno-padded)

要清楚,我只想抑制警告的一个特定实例(通常需要#pragma diagnostic push / pop),而不是文件中的所有警告。< / p>

2 个答案:

答案 0 :(得分:5)

Controlling Diagnostics via Pragmas文章所述,它将是:

#pragma clang diagnostic ignored "-Wno-padded"

如果要在某段代码中抑制警告(无论是单行代码还是多行语句),那么您需要使用push / pop机制:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wno-padded"
// your code for which the warning gets suppressed 
#pragma clang diagnostic pop
// not suppressed here

答案 1 :(得分:3)

如果您有一些包含文件,您可以在其中放置这样的宏定义:

#define DO_PRAGMA(x) _Pragma(#x)
#define NOWARN(warnoption, ...)                    \
    DO_PRAGMA(GCC diagnostic push)                 \
    DO_PRAGMA(GCC diagnostic ignored #warnoption)  \
    __VA_ARGS__                                    \
    DO_PRAGMA(GCC diagnostic pop)

然后您可以在代码中禁用警告,如下所示:

NOWARN(-Wpadded,
// your code for which the warning gets suppressed 
)

示例:https://godbolt.org/z/oW87ej


有点跑题:

gcc 不允许在表达式中使用 GCC diagnostic .... 编译指示。所以是这样的:

#define MY_MYCRO(type) NOWARN(-Wpadded, sizeof(struct{char c; type t;}))
int myval = MY_MYCRO(int);

会在 gcc 中产生错误并且不会编译。注意:使用 clang diagnostic .... 编译指示不会在 gcc 中产生错误(但也不会在 gcc 中禁用警告)。