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

-Wundef is not being ignored with pragma in g++

本文关键字:中的 pragma 忽略 g++ -Wundef      更新时间:2023-10-16

给定以下代码:

#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(){}

这只解决了CCD_ 2中的问题。

命令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

当第三方标头引发警告时,我以前所做的是将它们封装在我自己的私有标头中,该标头使用#pragma GCC system_header来静音该标头中的所有警告。我使用自己的包装器来保持includes的整洁,并在未来需要时提供额外的定制点。

这不是禁用警告,而是修复预处理器代码以避免它。以下测试基于类似的问题,使用clang -Weverything。。。

#define ZERO 0
#define ONE 1
#define EMPTY
// warning: 'NOTDEFINED' is not defined, evaluates to 0 [-Wundef]
#if NOTDEFINED
#warning NOTDEFINED
#endif
// false
#if ZERO
#warning ZERO
#endif
// true
#if ONE
#warning ONE
#endif
// error: expected value in expression
#if EMPTY
#warning EMPTY
#endif
// false
#if defined(NOTDEFINED) && NOTDEFINED
#warning NOTDEFINED
#endif
// false
#if defined(ZERO) && ZERO
#warning ZERO
#endif
// true
#if defined(ONE) && ONE
#warning ONE
#endif
// error: expected value in expression
#if defined(EMPTY) && EMPTY
#warning EMPTY
#endif

一行#if defined(SOME_MACRO) && SOME_MACRO可以避免此警告。要明确处理该案件。。。

#if defined(DEBUG_PRINT)
#if DEBUG_PRINT
... true
#else
... false
#endif
#else
#error DEBUG_PRINT must be defined
#endif

要处理EMPTY,请参阅以下内容:如何测试预处理器符号是否为#define';d但没有价值?