Unterschied zwischen #if defined(WIN32) und #ifdef(WIN32)
Lesezeit: 2 Minuten
Ameise2009
Ich kompiliere mein Programm, das auf Linux gcc 4.4.1 C99 läuft.
Ich habe gerade meine #defines eingefügt, um den Code zu trennen, der entweder unter Windows oder Linux kompiliert wird. Allerdings bekam ich diesen Fehler.
error: macro names must be identifiers.
Verwenden Sie diesen Code
#ifdef(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif
Als ich jedoch darauf umgestellt habe, wurde der Fehler behoben:
#if defined(WIN32)
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif
Ich habe mich nur gefragt, warum ich diesen Fehler bekommen habe und warum die #defines anders sind?
Danke vielmals,
Benutzer44556
Wenn Sie #ifdef-Syntax verwenden, entfernen Sie die Klammer.
Der Unterschied zwischen den beiden ist das #ifdef kann nur eine einzige Bedingung verwenden,
während #if defined(NAME) kann zusammengesetzte Bedingungen ausführen.
Zum Beispiel in Ihrem Fall:
#if defined(WIN32) && !defined(UNIX)
/* Do windows stuff */
#elif defined(UNIX) && !defined(WIN32)
/* Do linux stuff */
#else
/* Error, both can't be defined or undefined same time */
#endif
Ja, aber Sie könnten #ifdef UNIX auch mit #ifndef WIN32 kaskadieren und die gleiche Flexibilität erhalten (nicht so lesbar, da stimme ich zu).
– jpinto3912
11. November 2009 um 11:42 Uhr
@jpinto3912 Aber das wird noch haariger ||
– Aidiakapi
5. Januar 2016 um 18:18 Uhr
Wenn sie doch nur mitgegangen wären #if defined(NAME) von Anfang an und vermieden, eine zu erstellen #ifdef Aussage.
– Andy
20. Februar 2018 um 7:47 Uhr
Sourceforge hat eine gute referenz auf vordefinierten Compiler-Makros.
– Vesperto
23. Mai um 10:54 Uhr
Neha
#ifdef FOO
und
#if defined(FOO)
sind gleich,
aber um mehrere Dinge gleichzeitig zu tun, können Sie definierte verwenden, wie
#if defined(FOO) || defined(BAR)
#ifdef prüft, ob ein Makro mit diesem Namen definiert wurde, #if wertet den Ausdruck aus und prüft auf einen wahren Wert
#define FOO 1
#define BAR 0
#ifdef FOO
#ifdef BAR
/* this will be compiled */
#endif
#endif
#if BAR
/* this won't */
#endif
#if FOO || BAR
/* this will */
#endif
Dies beantwortet die Frage nicht. Die Frage fragt nach dem Unterschied zwischen #if defined und #ifdef.
– Hasan
12. Juni 2017 um 7:57 Uhr
Dies ist die beste Erklärung dafür, wie sich #if FOO und #if defined(FOO) unterschiedlich verhalten können.
– Paul Beusterien
30. September 2019 um 22:47 Uhr
Eine nützliche Antwort, da sie den feinen Unterschied zwischen zeigt #ifdef und #if
– Wahrheitsanpasser
16. Juli 2021 um 18:44 Uhr
#ifdef WIN32
/* Do windows stuff
#elif(UNIX)
/* Do linux stuff */
#endif
ist richtig
14247400cookie-checkUnterschied zwischen #if defined(WIN32) und #ifdef(WIN32)yes