如何处理铿锵声(3.9) - 扩展到定义的警告?

Wal*_*ter 8 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
Run Code Online (Sandbox Code Playgroud)

产生

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__))
Run Code Online (Sandbox Code Playgroud)

那么"正确"的方法是什么?

eer*_*ika 13

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

#if defined(__GNUC__) && !defined(__clang__)
#define HAS_GNU 1
#else
#define HAS_GNU 0
#endif
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意更改使用的代码HAS_GNU,可能更常规的方式:

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

#if defined(__clang__) || defined(HAS_GNU)
Run Code Online (Sandbox Code Playgroud)


iln*_*_al 5

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

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wexpansion-to-defined"
#import <pop/POP.h>
#pragma clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

  • 问题是“如何处理……”。如果您有第三个库,您显然无法更改源代码。这就是“如何处理”这个警告的方式,特别是如果项目将警告视为错误 (8认同)