Как бороться с предупреждением расширения (3.9) от Clang до определенного?

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

Так каков «правильный» способ сделать это?

4

Решение

Вы можете использовать макросы #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)
9

Другие решения

Если у вас есть проблема такого рода с сторонним модулем, вы можете найти это полезным

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

По вопросам рекламы [email protected]