参数化警告消沉宏麻烦

时间:2017-09-01 11:46:27

标签: c++ gcc c-preprocessor token suppress-warnings

以下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

我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:3)

问题是_Pragma希望有一个像这样的转义字符串文字

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

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

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

SUPPRESS("-Wuseless-cast")

在行动中查看here