参数化警告消音宏故障

parameterized warning silencing macro trouble

以下doesn't compile

#define SUPPRESS(w) _Pragma("GCC diagnostic ignored " ## w)

SUPPRESS("-Wuseless-cast")

int main() {
    int a = (int)4;
    return a;
}

这是错误:

error: pasting ""GCC diagnostic ignored "" and ""-Wuseless-cast"" does not give a valid preprocessing token

我怎样才能让它工作?

问题是 _Pragma 想要像这样的转义字符串文字

_Pragma("GCC diagnostic ignored \"-Wuseless-cast\"")

所以诀窍是在 SUPPRESS 的调用和 _Pragma 的调用之间添加另一层字符串化,如下所示

#define xSUPPRESS(w) _Pragma(#w)
#define SUPPRESS(w) xSUPPRESS(GCC diagnostic ignored w)

SUPPRESS("-Wuseless-cast")

查看它 here 的实际效果。