#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
In dem , was ist die Rolle der #ifdef
und #ifndef
, und was ist der Ausgang?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
In dem , was ist die Rolle der #ifdef
und #ifndef
, und was ist der Ausgang?
Antworten:
Text in einem ifdef/endif
oder einem ifndef/endif
Paar wird je nach Bedingung im Vorprozessor belassen oder vom Vorprozessor entfernt. ifdef
bedeutet "wenn Folgendes definiert ist", während ifndef
"wenn Folgendes nicht definiert ist" bedeutet.
So:
#define one 0
#ifdef one
printf("one is defined ");
#endif
#ifndef one
printf("one is not defined ");
#endif
ist äquivalent zu:
printf("one is defined ");
da one
definiert ist, ifdef
ist das wahr und das ifndef
ist falsch. Es spielt keine Rolle , was es definiert als . Ein ähnlicher (meiner Meinung nach besserer) Code wäre:
#define one 0
#ifdef one
printf("one is defined ");
#else
printf("one is not defined ");
#endif
da dies die Absicht in dieser besonderen Situation klarer spezifiziert.
In Ihrem speziellen Fall wird der Text nach dem ifdef
nicht entfernt, da one
definiert ist. Der Text nach dem ifndef
wird aus demselben Grund entfernt. endif
Irgendwann müssen zwei schließende Zeilen vorhanden sein, und die erste führt dazu, dass die Zeilen wie folgt wieder aufgenommen werden:
#define one 0
+--- #ifdef one
| printf("one is defined "); // Everything in here is included.
| +- #ifndef one
| | printf("one is not defined "); // Everything in here is excluded.
| | :
| +- #endif
| : // Everything in here is included again.
+--- #endif
Jemand sollte erwähnen, dass es in der Frage eine kleine Falle gibt. #ifdef
prüft nur, ob das folgende Symbol über #define
oder über die Befehlszeile definiert wurde , aber sein Wert (seine Ersetzung tatsächlich) ist irrelevant. Du könntest sogar schreiben
#define one
Precompiler akzeptieren das. Aber wenn Sie verwenden, ist #if
es eine andere Sache.
#define one 0
#if one
printf("one evaluates to a truth ");
#endif
#if !one
printf("one does not evaluate to truth ");
#endif
wird geben one does not evaluate to truth
. Das Schlüsselwort defined
ermöglicht es, das gewünschte Verhalten zu erhalten.
#if defined(one)
ist daher gleichbedeutend mit #ifdef
Der Vorteil des #if
Konstrukts besteht darin, dass Codepfade besser gehandhabt werden können. Versuchen Sie, so etwas mit dem alten #ifdef
/ #ifndef
pair zu tun .
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"#if one" bedeutet, dass, wenn "#define one" geschrieben wurde, "#if one" ausgeführt wird, andernfalls "#ifndef one" ausgeführt wird.
Dies ist nur die CPP-Richtlinie (C Pre-Processor), die den Verzweigungsanweisungen if, then, else in der Sprache C entspricht.
dh wenn {#define one} dann printf ("man bewertet eine Wahrheit"); sonst printf ("man ist nicht definiert"); Wenn es also keine #define one-Anweisung gäbe, würde der else-Zweig der Anweisung ausgeführt.
Der Code sieht seltsam aus, weil sich die printf nicht in Funktionsblöcken befinden.