如何处理铿锵声(3.9)-Wexpansion-to-defined警告?

时间:2017-02-06 17:44:38

标签: c++ c clang undefined-behavior defined

clang 3.9已向-Wall添加了警告-Wexpansion-to-defined,后者生成

  

宏观扩张生产'定义'有未定义的行为

如果在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__))

那么正确的'是什么?这样做的方法?

2 个答案:

答案 0 :(得分:10)

您可以使用#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)

答案 1 :(得分:1)

如果您在使用3d派对时遇到此类问题,您可能会发现这个有用的

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexpansion-to-defined"
#import <pop/POP.h>
#pragma clang diagnostic pop