c++ - -Wundef 不会被 g++ 中的 pragma 忽略

标签 c++ g++ compiler-warnings clang++ pragma

给定以下代码:

#if MACRO_WITHOUT_A_VALUE
int var;
#endif

int main(){}

编译时,g++ -std=c++1z -Wundef -o main main.cpp,
它会产生以下警告:

main.cpp:1:5: warning: "MACRO_WITHOUT_A_VALUE" is not defined [-Wundef]
 #if MACRO_WITHOUT_A_VALUE
     ^

我想保持启用警告标志,但抑制这个特定实例。
我应用以下内容:

#ifdef __GNUC__
#pragma GCC diagnostic ignored "-Wundef"
#pragma GCC diagnostic push
#endif

#if MACRO_WITHOUT_A_VALUE
int var;
#endif

#ifdef __GNUC__
#pragma GCC diagnostic pop
#endif

int main(){}

这只解决了clang++中的问题。

命令 clang++ -std=c++1z -Wundef -o main main.cpp 构建时没有警告。
命令 g++ -std=c++1z -Wundef -o main main.cpp 使用与之前相同的 [-Wundef] 警告构建。

如何在 g++ 中抑制 -Wundef 警告?

g++ (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0
clang version 3.8.0

最佳答案

当第三方 header 引发警告时,我之前所做的是将它们包装在我自己的私有(private) header 中,该 header 使用 #pragma GCC system_header 来消除来自该 header 的所有警告。我使用自己的包装器来保持包含的整洁,并允许在未来需要时提供额外的自定义点。

关于c++ - -Wundef 不会被 g++ 中的 pragma 忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38831058/

相关文章:

Embarcadero C++ Builder 中的 OpenCV 2.3

c++ - 如何将 Qt 样式表移动到外部文件但将其编译到资源中?

c++ - MongoDB 和 Visual C++ 2008 链接器错误

c++ - 如何隐式链接库?

C++ 程序,用 g++ 编译

c++ - 被调用者如何知道参数是通过寄存器而不是堆栈传递的

c++ - 警告级别为 3 的 int 的 std::vector push_back 处的编译器警告

c++ - 使用迭代器进行二分搜索

c++ - 继承一个带有内部类的模板类,并在继承类中访问内部类

C++:当包含从类模板派生的类的 header 时,编译器警告 C4505