2017-09-01 64 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在行動。