c++ - 如何处理 clang 的 (3.9) -Wexpansion-to-defined 警告?

标签 c++ c clang undefined-behavior defined

clang 3.9 已向 -Wall 添加了警告 -Wexpansion-to-defined,它会产生

macro expansion producing 'defined' has undefined behaviour

如果 defined#if 表达式之外使用,包括在 #if 表达式中使用宏的情况.比如下面的代码

// in some file:
#define HAS_GNU (defined(__GNUC__) && !defined(__clang__))

// possibly in another file:
#if defined(__clang__) || HAS_GNU
/* ... */
#endif

产生

test.cc:5:27: warning: macro expansion producing 'defined' has undefined behavior [-Wexpansion-to-defined]
#if defined(__clang__) || HAS_GNU
                          ^
test.cc:3:18: note: expanded from macro 'HAS_GNU'
#define HAS_GNU (defined(__GNUC__) && !defined(__clang__))
                 ^
test.cc:5:27: warning: macro expansion producing 'defined' has undefined behavior [-Wexpansion-to-defined]
test.cc:3:40: note: expanded from macro 'HAS_GNU'
#define HAS_GNU (defined(__GNUC__) && !defined(__clang__))

那么“正确”的方法是什么?

最佳答案

您可以使用#if - #else 宏:

#if defined(__GNUC__) && !defined(__clang__)
#define HAS_GNU 1
#else
#define HAS_GNU 0
#endif

或者,如果您愿意更改使用 HAS_GNU 的代码,也许更传统的方式:

#if defined(__GNUC__) && !defined(__clang__)
#define HAS_GNU
#endif

#if defined(__clang__) || defined(HAS_GNU)

关于c++ - 如何处理 clang 的 (3.9) -Wexpansion-to-defined 警告?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42074035/

相关文章:

c - 如何仅读取包含字母和数字的文件中的字母?

c++ - 在 g++ 4.8.1 中使用枚举启用_if

c++ - 删除析构函数的类被认为是可简单复制的?

c++ - OpenGL 临时缓冲区

c++ - 在 solaris 上 boost 库信号量

c++ - GCC - 包含编译标志的宏

ARM 的 Clang 交叉编译

c++ - 在 OpenSceneGraph 中创建一个球体(使用 osg::Geometry)

c - 在 ")"之后定义函数的参数类型,这是一个非常古老的标准吗?

c - 如何用C创建菜单?