2016-07-16 42 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

因为在其他情况下可能会有歧义,我想。至于有用的功能 - 我当然可以想到可能的用途,但是如果每个人都尽可能多地使用它,我对可能的命名空间污染有一些保留。我们将不得不看看如何发展,我猜... –

相关问题