-Wundef 不会被 g++ 中的 pragma 忽略
-Wundef is not being ignored with pragma in g++
给定以下代码:
#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 发出警告时所做的是将它们包装在我自己的私有 header 中,它使用 #pragma GCC system_header
来消除来自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?
给定以下代码:
#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 发出警告时所做的是将它们包装在我自己的私有 header 中,它使用 #pragma GCC system_header
来消除来自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?