2017-02-06 2 views
3

clang 3,9 a ajouté à -Wall un avertissement -Wexpansion-to-defined, qui produitComment gérer l'avertissement de clang (3.9) -Exposition-à-définir?

extension macro produisant « défini » a un comportement non défini

en cas defined est utilisée en dehors d'une expression #if, y compris le cas de une macro qui est ensuite utilisée dans une expression #if. Par exemple, le code suivant

// in some file: 
#define HAS_GNU (defined(__GNUC__) && !defined(__clang__)) 

// possibly in another file: 
#if defined(__clang__) || HAS_GNU 
/* ... */ 
#endif 

produit

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

Alors, quelle est la façon de le faire 'correct' qui?

Répondre

5

Vous pouvez utiliser #if - macros #else:

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

Ou, si vous êtes prêt à changer le code qui utilise HAS_GNU, façon peut-être plus classique:

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

#if defined(__clang__) || defined(HAS_GNU)