2017-09-01 62 views
2

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

我怎样才能得到它的工作?

+0

根据[翻译阶段](http://en.cppreference.com/w/cpp/language/translation_phases)处理'_Pragma'指令,您可能可能依赖标准连续字符串级联。这意味着如果你有两个字符串常量,它们之间只有空格(或注释),那么它们将自动连接成一个字符串。如果是这样,那么你不需要预处理器连接运算符。你可能想尝试一下。 –

+0

@Someprogrammerdude喜欢'''_Pragma(“忽略GCC诊断”w)'''?不起作用。您也可以尝试使用我提供的在线编译器链接。 – onqtam

回答

3

的事情是,_Pragma希望有一个转义字符串字面像这样

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

因此,关键是要的​​通话和_Pragma像下面

通话之间添加stringyfication的另一层
#define xSUPPRESS(w) _Pragma(#w) 
#define SUPPRESS(w) xSUPPRESS(GCC diagnostic ignored w) 

SUPPRESS("-Wuseless-cast") 

看到它here在行动。