3 Stimmen

Was ist der Unterschied zwischen diesen Compiler-Direktiven?

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

#ifdef FOO

#if defined FOO

#if defined(FOO)

Ich benutze den CCS Compiler, bin aber auch an anderen C-Compilern interessiert.

9voto

Mark Rushakoff Punkte 236626

Meines Wissens nach wird #if defined in erster Linie verwendet, um eine Überprüfung auf mehrere Makrodefinitionen in einer Zeile durchzuführen. Ansonsten sind sie, soweit ich weiß, für bedingte Einzelmakrodefinitionen identisch.

#include 
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 problemlos mit gcc -Wall -ansi a.c, was darauf hindeutet, dass #if defined korrektes ANSI C ist. Darüber hinaus listet diese ANSI C-Zusammenfassung von 1987 #if defined als neu definiertes Verhalten für den Preprozessor gemäß ANSI-Standards auf - dies sollte bei jedem ANSI-konformen Compiler, den Sie verwenden, standardmäßig sein.

Wenn Sie #if defined nicht verwenden würden, müssten Sie Folgendes tun

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

Außerdem sagt das Redhat-Handbuch für den C-Präprozessor

#if defined MACRO ist genau äquivalent zu #ifdef MACRO.

3voto

Adam Rosenfield Punkte 373807

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

  • Wenn Sie nach Definitionen mehrerer Symbole oder komplexerer Ausdrücke testen:

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

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

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

1voto

Juparave Punkte 686

#ifdef ist die Abkürzung für #if defined und ich glaube, dass du auf keiner von beiden Klammern brauchst, also sind sie im Grunde genommen das Gleiche.

Ich komme von Turbo C und bin es gewohnt, #ifdef zu verwenden, anstelle von #if defined.

1voto

DigitalRoss Punkte 138823

Ursprünglich gab es nur #ifdef, aber als #if hinzukam, war es notwendig, defined() zu haben, damit #if das #ifdef überschreiten konnte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X