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.
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.
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
.
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.
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.