如何禁用 g++ 中的特定警告

How to disable a specific warning in g++

首先我不知道为什么 "g++ -std=c++0x -Wall" 会给我 警告:文字后缀无效; C++11 要求在以下程序中在文字和字符串宏 [-Wliteral-suffix] 之间使用 space:

#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-suffix”,但仍然收到警告。如何抑制警告?为什么编译器首先发出警告?

好吧,总结一下:无法抑制警告是一个已知的 gcc 错误 (gcc.gnu.org/bugzilla/show_bug.cgi?id=61653)。由于您不能(实际上也不应该)抑制该警告,最简单的解决方法是在文字和#define 字符串之间放置一个 space。您可以放心地这样做;它不会改变输出文本。

不再允许这样做的原因是,紧跟在文字字符串之后的字符被视为用户定义的文字,这是 C++11 中的新功能。用户定义的文字被认为是与他们修改的文字相同的单个标记的一部分,因此 END 不会被早期的 #define 替换。