2016-07-16 43 views
1

首先,我不知道爲什麼「g ++ -std = C++ 0x -Wall」會給我警告:文字上的無效後綴; C++ 11需要在下面的程序文字和字符串宏[-Wliteral後綴]之間的空間:如何禁用g ++中的特定警告

#include <iostream> 

#define BEGIN "<b>" 
#define END "</b>" 

#pragma GCC diagnostic ignored "-Wliteral-suffix" 
int main() 
{ 
    std::cout << "hello " BEGIN"world"END "\n"; 
} 

其次,我也跟着gcc doc忽略「-Wliteral後綴」,但還是得到了警告。我如何壓制警告?爲什麼編譯器首先警告?

+1

你不知道警告是什麼,但你想壓制它嗎?如果你不知道它是什麼,你怎麼能確定抑制它是適當的響應? – hvd

+0

此警告看起來像一個海灣合作委員會的錯誤,這就是爲什麼我想壓制它。 – zhao

+2

顯然,未能取消是已知的gcc錯誤(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61653)。我不知道爲什麼它關心這個 - 代碼對我來說看起來很好(儘管#defines是眼睛疼痛)。您可以通過簡單地在文字和#define字符串之間插入空格來修復它 - 它不會更改文本。 –

回答

1

好的,總結一下:未能抑制警告是一個已知的gcc錯誤(gcc.gnu.org/bugzilla/show_bug.cgi?id=61653)。既然你不能(並且確實不應該)壓制警告,最簡單的解決方法是在文字和#define字符串之間加一個空格。你可以安全地做到這一點;它不會更改輸出文本。

這不再被允許的原因是因爲字符串之後的字符被視爲用戶定義的文字,這是C++ 11中的一個新特性。用戶定義的文字被認爲是與它們修改的文字相同的單個記號的一部分,因此END將不會被前面的#define取代。

+0

我從來沒有聽說過'用戶定義文字',也想知道我會使用這個功能。顯然,gcc知道我正在使用一個緊跟着一個宏的字符串(如警告消息所示),那麼爲什麼它仍然警告說,沒有歧義,它可以擴展宏? – zhao

+0

因爲在其他情況下可能會有歧義,我想。至於有用的功能 - 我當然可以想到可能的用途,但是如果每個人都儘可能多地使用它,我對可能的命名空間污染有一些保留。我們將不得不看看如何發展,我猜... –

相關問題