Die Rolle von #ifdef und #ifndef

99
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

In dem , was ist die Rolle der #ifdefund #ifndef, und was ist der Ausgang?

alka pandey
quelle

Antworten:

131

Text in einem ifdef/endifoder einem ifndef/endif Paar wird je nach Bedingung im Vorprozessor belassen oder vom Vorprozessor entfernt. ifdefbedeutet "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 onedefiniert ist, ifdefist das wahr und das ifndefist 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 ifdefnicht entfernt, da onedefiniert ist. Der Text nach dem ifndef wird aus demselben Grund entfernt. endifIrgendwann 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
paxdiablo
quelle
68

Jemand sollte erwähnen, dass es in der Frage eine kleine Falle gibt. #ifdefprüft nur, ob das folgende Symbol über #defineoder ü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 #ifes 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 definedermöglicht es, das gewünschte Verhalten zu erhalten.

#if defined(one) 

ist daher gleichbedeutend mit #ifdef

Der Vorteil des #ifKonstrukts besteht darin, dass Codepfade besser gehandhabt werden können. Versuchen Sie, so etwas mit dem alten #ifdef/ #ifndefpair zu tun .

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
Patrick Schlüter
quelle
0

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

Rodders
quelle
4
Ich bin mir nicht sicher, was dies hinzufügt, dass die anderen Antworten noch nicht behandelt werden, und Ihr Beispiel ist nicht C oder C ++.
SirGuy
-2

Der Code sieht seltsam aus, weil sich die printf nicht in Funktionsblöcken befinden.

hwx
quelle
1
Der gesamte Block kann sich innerhalb einer Funktion selbst befinden. Und willkommen zum Stackoverflow. Bitte lesen Sie stackoverflow.com/help/how-to-answer .
Rajashekar