在g++中,使用#pragma指令时未忽略-Wundef警告

7

考虑以下代码:

#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

1
你可以使用 #if defined(MACRO_WITHOUT_A_VALUE) && MACRO_WITHOUT_A_VALUE 吗? - Ry-
也许吧,但我正在封装第三方代码,我不想修改它。 - Trevor Hickey
那么应该用 #ifdef 包裹起来吗? - Ry-
@Ryan 这正是我现在正在做的事情。我希望我能有某种通用方法,而不必知道内部宏。例如:#include "push_all_warnings.hpp" #include "3rd_party.hpp" #include "pop_all_warnings.hpp" - Trevor Hickey
你把 ignoredpush 指令搞反了,但这是一个已知的 GCC 问题。https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53431 - Ry-
显示剩余2条评论
2个回答

7

在第三方头文件引发警告时,我曾经做的是将它们包装在自己的私有头文件中,并使用 #pragma GCC system_header 仅静默该头文件中所有警告。我使用自己的包装器来保持包含关系的清晰,并在将来需要的情况下提供额外的定制点。


1
这并不是禁用警告,而是修复预处理器代码以避免警告。以下测试基于类似问题 这里,使用 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但没有值?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接