clang 3.9 hinzugefügt hat -Wall
eine Warnung -Wexpansion-to-defined
die produziert
Makroerweiterung, die ‘definiert’ erzeugt, hat undefiniertes Verhalten
im Fall defined
wird außerhalb verwendet #if
Ausdruck, einschließlich des Falls eines Makros, das dann innerhalb von verwendet wird #if
Ausdruck. Zum Beispiel der folgende Code
// in some file:
#define HAS_GNU (defined(__GNUC__) && !defined(__clang__))
// possibly in another file:
#if defined(__clang__) || HAS_GNU
/* ... */
#endif
produziert
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__))
Was ist also der “richtige” Weg, das zu tun?