Frage

Was ist, wenn überhaupt, der Unterschied zwischen diesen Richtlinien?

#ifdef FOO

#if defined FOO

#if defined(FOO)

Ich benutze den CCS -Compiler, aber ich interessiere mich für andere C Compiler auch.

War es hilfreich?

Lösung

Nach dem, was ich gesehen habe, die Hauptverwendung für #if defined ist eine Überprüfung mehrerer Makrodefinitionen in einer Zeile durchzuführen. Andernfalls sind sie für einzelne Makro -Definitionsbedingungen soweit ich weiß.

#include <stdio.h>
int main()
{
#if defined(FOO) && defined(BAR)
    printf("foobar!\n");
#else
    printf("nothing.\n");
#endif
    return 0;
}
$ tcc -DFOO -run a.c 
nothing.
$ tcc -DBAR -run a.c 
nothing.
$ tcc -DFOO -DBAR -run a.c 
foobar!

Außerdem kompiliert das obige Programm gut mit gcc -Wall -ansi a.c Das deutet also darauf hin #if defined ist korrekt Ansi C. Außerdem, Diese ANSI -C -Zusammenfassung von 1987 Listen #if defined Als neu definiertes Verhalten für den Präprozessor gemäß ANSI -Standards - dies sollte Seien Sie Standard für jeden ANSI-konformen Compiler, den Sie verwenden werden.

Wenn Sie nicht benutzt haben #if defined, müsst du tun

#ifdef FOO
#ifdef BAR
    printf("foobar!\n");
#endif /* BAR */
#endif /* FOO */

Ebenfalls, Das Redhat -Handbuch für den C -Präprozessor sagt

#if defined MACRO ist genau gleichbedeutend mit #ifdef MACRO.

Andere Tipps

Alle 3 Formulare sind genau entsprechend dem C99 -Standard äquivalent und gültig. Allgemein #ifdef wird bevorzugt, weil es kürzer ist als die beiden anderen Formen, aber es gibt Situationen, in denen Sie die anderen Formen verwenden möchten:

  • Wenn Sie die Definitionen mehrerer Symbole oder komplexere Ausdrücke testen:

    #if defined(ONE_THING) && define(ANOTHER_THING) && (3 < 4)
    ...
    #endif
    
  • Wenn Sie mehrere Klauseln haben, ist es viel einfacher zu bedienen #elif defined(...) als #else, #ifdef:

    #if defined(ONE_THING)
    ...
    #elif defined(ANOTHER_THING)
    ...
    #elif defined(THIRD_THING)
    ...
    #else
    ...
    #endif
    

Die Verwendung von Klammern mit defined es ist optional; Ich bevorzuge sie, um Klarheit hinzuzufügen.

#ifdef ist kurz für #if definiert Und ich denke, Sie brauchen keine Klammern, also sind sie im Grunde genommen gleich.

Wenn ich aus Turbo C komme, bin ich es gewohnt zu sehen #ifdef statt #if definiert

Ursprünglich gab es nur #ifdef, aber wenn #if kam mit, es war notwendig zu haben defined() damit #if zu superset #ifdef.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top