#if-, #elif-, #else- und #endif-Anweisungen
Präprozessordirektiven, die die Kompilierung von Teilen einer Quelldatei steuern.
#if ifCondition ... |
---|
[#elif elifCondition ...] |
[#else ...] |
#endif |
Parameter
Element | Beschreibung |
---|---|
ifCondition |
Primäre Bedingung, die ausgewertet werden soll. Wenn dieser Parameter zu einem Wert ungleich 0 (null) ausgewertet wird, wird der gesamte Text zwischen dieser #if-Direktive und der nächsten instance der #elif-, #else- oder #endif-Direktive in der Übersetzungseinheit beibehalten. Andernfalls wird der nachfolgende Quellcode nicht beibehalten. Die Bedingung kann den definierten Präprozessoroperator verwenden, um zu bestimmen, ob eine bestimmte Präprozessorkonstante oder ein bestimmtes Makro definiert ist. diese Verwendung entspricht der Verwendung der #ifdef-Direktive . Einschränkungen für den Wert des ifCondition-Parameters finden Sie im Abschnitt Hinweise. |
elifCondition [optional] |
Andere auszuwertende Bedingung. Wenn der IfCondition-Parameter und alle vorherigen #elif-Direktiven zu null ausgewertet werden und dieser Parameter zu einem Wert ungleich null ausgewertet wird, wird der gesamte Text zwischen dieser #elif-Direktive und der nächsten instance der #elif-, #else- oder #endif-Direktive in der Übersetzungseinheit beibehalten. Andernfalls wird der nachfolgende Quellcode nicht beibehalten. Die Bedingung kann den definierten Präprozessoroperator verwenden, um zu bestimmen, ob eine bestimmte Präprozessorkonstante oder ein bestimmtes Makro definiert ist. diese Verwendung entspricht der Verwendung der #ifdef-Direktive . Einschränkungen für den Wert des elifCondition-Parameters finden Sie im Abschnitt Hinweise. |
Bemerkungen
Jede #if-Direktive in einer Quelldatei muss durch eine schließende #endif-Direktive abgeglichen werden. Zwischen den #if- und #endif-Direktiven kann eine beliebige Anzahl von #elif-Direktiven angezeigt werden, aber höchstens eine #else-Direktive ist zulässig. Die #else-Direktive muss, sofern vorhanden, die letzte Direktive vor #endif sein. Anweisungen für die bedingte Kompilierung, die in Includedateien enthalten sind, müssen dieselben Bedingungen erfüllen.
Die Direktiven #if, #elif, #else und #endif können in den Textabschnitten anderer #if-Direktiven geschachtelt werden. Jede geschachtelte #else-, #elif- oder #endif-Direktive gehört zur nächstgelegenen vorangehenden #if-Direktive.
Wenn keine Bedingungen zu einem Wert ungleich null ausgewertet werden, wählt der Präprozessor den Textblock nach der #else-Direktive aus. Wenn die #else-Klausel ausgelassen wird und keine Bedingungen zu einem Wert ungleich null ausgewertet werden, wird kein Textblock ausgewählt.
Die Parameter ifCondition und elifCondition erfüllen die folgenden Anforderungen:
- Ausdrücke für die bedingte Kompilierung werden als lange Vorzeichenwerte behandelt, und diese Ausdrücke werden mit den gleichen Regeln wie Ausdrücke in C++ ausgewertet.
- Ausdrücke müssen einen ganzzahligen Typ aufweisen und können nur ganzzahlige Konstanten und Zeichenkonstanten und den defined -Operator umfassen.
- Ausdrücke können keine Sizeof - oder type-cast-Operatoren verwenden.
- Die Zielumgebung ist möglicherweise nicht in der Lage, alle Bereiche von ganzen Zahlen darzustellen.
- Die Übersetzung stellt den Typ int gleich dem Typ long und unsigned int die gleiche wie unsigned long dar.
- Das Konvertierungsprogramm kann Zeichenkonstanten in einen Satz von Codewerten übersetzen, die sich vom Satz für die Zielumgebung unterscheiden. Um die Eigenschaften der Zielumgebung zu bestimmen, überprüfen Sie die Werte der Makros von LIMITS.H in einer für die Zielumgebung erstellten Anwendung.
- Der Ausdruck darf keine Umgebungsabfragen durchführen und muss von Implementierungsdetails auf dem Zielcomputer isoliert bleiben.
Beispiele
Dieser Abschnitt enthält Beispiele, die die Verwendung von Präprozessordirektiven für die bedingte Kompilierung veranschaulichen.
Verwendung des definierten Operators
Das folgende Beispiel zeigt die Verwendung des definierten Operators. Wenn der Bezeichner CREDIT definiert ist, wird der Aufruf der Kreditfunktion kompiliert. Wenn der Bezeichner DEBIT definiert ist, wird der Aufruf der Debitfunktion kompiliert. Wenn keiner der Bezeichner definiert ist, wird der Aufruf der printerror-Funktion kompiliert. Beachten Sie, dass "CREDIT" und "credit" unterschiedliche Bezeichner in C und C++ sind, da die Fälle unterschiedlich sind.
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
Verwendung geschachtelter #if-Anweisungen
Im folgenden Beispiel wird gezeigt, wie #if-Anweisungen geschachtelt werden. In diesem Beispiel wird davon ausgegangen, dass zuvor eine symbolische Konstante namens DLEVEL definiert wurde. Die #elif- und #else-Direktiven werden verwendet, um eine von vier Optionen zu treffen, die auf dem Wert von DLEVEL basieren. Die Stack-Konstante wird abhängig von der Definition von DLEVEL auf 0, 100 oder 200 festgelegt. Wenn DLEVEL größer als 5 ist, ist STACK nicht definiert.
#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
Verwenden sie zum Einschließen von Headerdateien
Eine übliche Verwendung für die bedingte Kompilierung besteht darin, mehrere Inklusionen derselben Headerdatei zu verhindern. In C++, wo Klassen häufig in Headerdateien definiert werden, können Konstrukte der bedingten Kompilierung verwendet werden, um mehrere Definitionen zu verhindern. Im folgenden Beispiel wird bestimmt, ob die symbolische Konstante EXAMPLE_H definiert ist. Wenn dies der Fall ist, ist die Datei bereits enthalten und muss nicht erneut verarbeitet werden. Andernfalls wird die Konstante EXAMPLE_H definiert, um dieses BEISPIEL anzugeben. H wurde bereits verarbeitet.
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example
{
...
};
#endif // !defined( EXAMPLE_H )