2017-02-06 2 views
3

лязг 3.9 добавил к -Wall в предупреждении -Wexpansion-to-defined, который производитКак справиться с предупреждением о появлении ключа (3.9)?

макрорасширение продуцирующего «определяется» имеет неопределенное поведение

в случае 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__)) 

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

ответ

5

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