假设我的代码中有一些警告,例如Clang已经为结构添加了填充。我找到了那个特定的实例,我想把它标记为“Noted;不要再警告我这个实例了。”
有没有办法做到这一点并不是非常冗长(即#pragma clang diagnostic push
等)?理想情况下,就像警告在同一行上的注释,如下所示:
// clang(-Wno-padded)
要清楚,我只想抑制警告的一个特定实例(通常需要#pragma diagnostic push
/ pop
),而不是文件中的所有警告。< / p>
答案 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 中禁用警告)。