考虑下面的代码:
#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]
警告建立。
我怎样才能抑制-Wundef
g++
警告?
g++ (Ubuntu 5.1.0-0ubuntu11~14.04.1) 5.1.0
clang version 3.8.0
我当第三者头被诱导的警告之前所做的就是将它们包装在使用#pragma GCC system_header
只是沉默所有从头部的警告我自己的私人头。我用我自己的包装,如果需要保持包括整齐,允许在未来的一个额外的定制点。
这不是禁止警告,但固定预处理器的代码,以避免它。下面的测试是基于类似的问题here,使用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
看到这一点:How to test if preprocessor symbol is #define'd but has no value?