Was ist der Unterschied zwischen diesen Compiler -Richtlinien?
-
19-09-2019 - |
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.
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
.