web-dev-qa-db-ja.com

clang(3.9)-Wexpansion-to-defined警告に対処する方法は?

clang3.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__))

それで、それを行うための「正しい」方法は何ですか?

9
Walter

#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)
12
eerorika

サードパーティのポッドでこの種の問題が発生した場合は、これが役立つことがあります

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