Wie geht man mit clangs (3.9) -Wexpansion-to-defined-Warnung um?

Lesezeit: 1 Minute

clang 3.9 hinzugefügt hat -Wall eine Warnung -Wexpansion-to-defineddie 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?

Sie können #if – #else Makros verwenden:

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

Oder wenn Sie bereit sind, den verwendeten Code zu ändern HAS_GNUvielleicht konventioneller Weg:

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

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

Wenn Sie diese Art von Problem mit einem 3D-Party-Pod haben, finden Sie dies möglicherweise nützlich

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

  • das beantwortet die frage nicht. Bei der Frage geht es nicht darum, die Warnungen zu deaktivieren.

    – Jean-Francois Fabre

    19. Dezember 2019 um 21:44 Uhr

  • Die Frage lautet „Wie gehe ich mit … um?“. Wenn Sie eine 3. Bibliothek haben, können Sie natürlich keine Änderungen am Quellcode vornehmen. Und so geht man mit dieser Warnung um, besonders wenn das Projekt Warnungen als Fehler behandelt

    – ilnar_al

    20. Dezember 2019 um 10:23 Uhr

1437510cookie-checkWie geht man mit clangs (3.9) -Wexpansion-to-defined-Warnung um?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy