Freigeben über


#if-, #elif, #else und #endif Direktive (C/C++)

Die #if-Direktive, mit #elif, und #endif-Direktiven gesteuert, #elseKompilierung von Teilen einer Quelldatei.Wenn der Ausdruck, den Sie schreiben (nach dem #if) verfügen, wird ein Wert ungleich 0 (null) Zeilen, die unmittelbar auf die Gruppe #if-Direktive in der Übersetzungseinheit beibehalten.

Grammatik

  • bedingt :
    Wenn ein TeiloptoptElif-partselse-partendif Zeile

  • WennTeil :
    WennZeile Text

  • WennZeile :
    #if konstanter Ausdruck

    #ifdef Bezeichner

    der #ifndef Bezeichner

  • Elif Teilen :
    ElifZeile Text

    ElifTeile ElifZeile Text

  • ElifZeile :
    #elif konstanter Ausdruck

  • ELSETeil :
    ELSEZeile Text

  • ELSEZeile :
    #else

  • EndifZeile :
    #endif

Jede #if-Direktive in einer Quelldatei müssen durch Schließen von #endif-Direktive zugeordnet werden.Eine beliebige Anzahl #elif-Direktive kann zwischen #if und den #endif-Direktive angezeigt werden, sind jedoch höchstens eine #else-Direktive können.Die #else-Direktive, falls vorhanden, müssen die letzten - Direktive vor #endifsein.

#if, #elif, #elseund #endif-Direktiven können in anderen Teilen des Texts #if-Direktive schachteln.Bei geschachtelten #else, #elif, oder #endif-Direktiven gehören den nächsten vorangehenden #if-Direktive.

Alle Bedingt Kompilierung Direktiven, wie #if und #ifdef, müssen mit dem Schließen von #endif-Direktive vor dem Dateiende gefunden werden. andernfalls wird eine Fehlermeldung generiert.Wenn Bedingt Kompilierung - Direktive in den Dateien enthalten sind, müssen sie die gleichen Anforderungen erfüllen: Es muss keine Bedingt Kompilierung ohne Übereinstimmung Direktive am Ende der Includedatei geben.

Makro Ersetzung wird innerhalb des Teils der Befehlszeile ausgeführt, die einem #elif Befehl erfolgreich ist, sodass ein Makro-Aufruf im konstanten Ausdruckverwendet werden.

Der Präprozessor wählt eine der angegebenen Vorkommen des Texts für die weitere Verarbeitung aus.Ein Block, der im Textkörper angegeben ist, kann jede Sequenz des Texts sein.Es kann mehr als eine Zeile belegen.Normalerweise ist Text Programmtext, der Bedeutung für den Compiler oder den Präprozessor verfügt.

Der Präprozessor verarbeitet den markierten Text, und übergibt sie an den Compiler.Wenn Text einer Präprozessordirektive enthält, führt der Präprozessor diese Direktive durch.Nur die Textblöcke, die vom Präprozessor Option aktiviert ist, werden kompiliert.

Der Präprozessor wählt ein einzelnes Textelement aus, indem er den konstanten Ausdruck ergibt, die jeden #if oder #elif-Direktive folgt, bis er einen echten (ungleich 0 (null) konstanten Ausdruck findet.Er wählt den gesamten Text (einschließlich anderer Präprozessordirektiven, die mit **#**beginnen) bis auf den zugeordneten #elif, bis #elseoder #endifaus.

Wenn alle Vorkommen des konstanten Ausdrucks falsch sind oder wenn keine #elif-Direktive angezeigt werden, wählt der Präprozessor den Textblock nach der #else-Klausel aus.Wenn die #else-Klausel ausgelassen wird, und alle Instanzen des konstanten Ausdrucks im Block #if sind, wird kein Textblock ausgewählt.

Der konstante Ausdruck ist ein ganzzahliger konstanter Ausdruck mit diesen zusätzlichen Einschränkungen:

  • Ausdrücke müssen ganzzahligen Typ aufweisen und können nur ganzzahlige Konstanten und Zeichenkonstanten, Definition den Operator einschließen.

  • Der Ausdruck kann sizeof oder einen Operator Typumwandlungs nicht verwendet werden.

  • Die Zielumgebung ist möglicherweise nicht in der Lage, alle Bereiche von ganzen Zahlen dargestellt werden.

  • Die Übersetzung int-Typ stellt dieselben wie longTyp und unsigned int dieselben wie unsigned longdar.

  • Der Übersetzung Zeichenkonstanten kann auf einen Satz von Codewerten übersetzen, die zu dem Satz für die Zielumgebung unterscheiden.So legen Sie die Eigenschaften der Zielumgebung bestimmen, Kontrollwerte von Makros aus LIMITS.H in einer Anwendung erstellt für die Zielumgebung.

  • Der Ausdruck darf keine Anforderungen Umgebung ausführen und muss isoliert der Implementierungsdetails auf dem Zielcomputer bleiben.

Der Operator Präprozessor Definition kann in speziellen konstanten Ausdrücken, wie weiter durch die folgende Syntax verwendet werden:

identifier (Definition)

definiertes identifier

Diesen konstanten Ausdruck wird als Wert ungleich 0 (wahr), wenn der Bezeichner gegenwärtig definiert wurde. Andernfalls ist die Bedingung false (0).Ein Bezeichner, der definiert wird, wird definiert als leerer Text.Die Definition-Direktive kann in #if und #elif-Direktive verwendet werden, aber andere nirgendwo.

Im folgenden Beispiel #endif-Direktive und #if steuern die Kompilierung von einem von Dreifunktions-Aufrufen:

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

Der Funktionsaufruf zu credit wird kompiliert, wenn der Bezeichner CREDIT definiert ist.Wenn der Bezeichner DEBIT definiert ist, wird der Funktionsaufruf zu debit kompiliert.Wenn keines der Bezeichner definiert wird, wird der Aufruf printerror kompiliert.Beachten Sie, dass CREDIT und credit unterschiedliche Bezeichner in C und C++ sind, da ihre Fälle unterschiedlich sind.

Die Anweisungen für die bedingte Kompilierung im folgenden Beispiel eine zuvor definierte symbolische Konstante an, die DLEVELbenannt ist.

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

Der erste #if-Block enthält zwei Sätze von geschachtelten #if, #elseund der #endif-Direktive an.Zum einen Satz von der Direktive wird nur verarbeitet, wenn DLEVEL > 5 true ist.Andernfalls werden die Anweisungen nach #Andernfalls verarbeitet.

Die #elif und #else-Direktive im zweiten Beispiel werden verwendet, um eine aus vier Möglichkeiten, je nach dem Wert von DLEVELzu machen.Konstante STACK auf 0, 100 oder 200, abhängig von der Definition von DLEVELfestgelegt.Wenn DLEVEL größer als 5 ist, ist die Anweisung

#elif DLEVEL > 5
display(debugptr);

kompiliert wird und STACK ist nicht definiert.

Eine übliche Verwendung für die bedingte Kompilierung ist, mehrere Inklusionen derselben Headerdatei zu verhindern.In C++ in dem Klassen häufig in den Headerdateien definierte Konstrukte können beispielsweise folgendermaßen verwendet werden, um mehrere Definitionen zu vermeiden:

/*  EXAMPLE.H - Example header file  */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Die vorangehenden Code überprüft, ob symbolische Konstante EXAMPLE_H definiert ist.In diesem Fall wurde die Datei bereits vorhanden ist und muss nicht erneut verarbeitet werden muss.Wenn dies nicht der Fall ist, wird die Konstante EXAMPLE_H definiert, um EXAMPLE.H zu markieren, wie bereits verarbeitet.

Siehe auch

Referenz

Präprozessordirektiven