Unterschied zwischen #if defined(WIN32) und #ifdef(WIN32)

Lesezeit: 2 Minuten

Benutzeravatar von ant2009
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,

Benutzeravatar von user44556
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

Benutzeravatar von neha
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

1424740cookie-checkUnterschied zwischen #if defined(WIN32) und #ifdef(WIN32)

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

Privacy policy