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?

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

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

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.