Directives #if, #elif, #else et #endif
Directives de préprocesseur qui contrôlent la compilation de parties d’un fichier source.
#if ifCondition ... |
---|
[#elif elifCondition ...] |
[#else ...] |
#endif |
Paramètres
Élément | Description |
---|---|
ifCondition |
Condition principale à évaluer. Si ce paramètre est évalué à une valeur différente de zéro, tout le texte entre cette directive #if et la instance suivante de la directive #elif, #else ou #endif est conservé dans l’unité de traduction ; sinon, le code source suivant n’est pas conservé. La condition peut utiliser l’opérateur de préprocesseur défini pour déterminer si une constante ou une macro de préprocesseur spécifique est définie ; cette utilisation équivaut à l’utilisation de la directive #ifdef . Consultez la section Remarques pour connaître les restrictions relatives à la valeur du paramètre ifCondition . |
elifCondition [facultatif] |
Autre condition à évaluer. Si le paramètre ifCondition et toutes les directives #elif précédentes sont évalués à zéro et que ce paramètre est évalué à une valeur différente de zéro, tout le texte entre cette directive #elif et la instance suivante de la directive #elif, #else ou #endif est conservé dans l’unité de traduction ; sinon, le code source suivant n’est pas conservé. La condition peut utiliser l’opérateur de préprocesseur défini pour déterminer si une constante ou une macro de préprocesseur spécifique est définie ; cette utilisation équivaut à l’utilisation de la directive #ifdef . Consultez la section Remarques pour connaître les restrictions relatives à la valeur du paramètre elifCondition . |
Notes
Chaque directive #if dans un fichier source doit être mise en correspondance par une directive #endif fermante. Un nombre quelconque de directives #elif peut apparaître entre les directives #if et #endif, mais au plus une directive #else est autorisée. La directive #else, le cas échéant, doit être la dernière directive avant #endif. Les directives de compilation conditionnelle contenues dans les fichiers include doivent remplir les mêmes conditions.
Les directives #if, #elif, #else et #endif peuvent s’imbriquer dans les parties de texte d’autres directives #if. Chaque directive #else, #elif ou #endif imbriquée appartient à la directive #if précédente la plus proche.
Si aucune condition n’est évaluée à une valeur différente de zéro, le préprocesseur sélectionne le bloc de texte après la directive #else. Si la clause #else est omise et qu’aucune condition n’est évaluée à une valeur différente de zéro, aucun bloc de texte n’est sélectionné.
Les paramètres ifCondition et elifCondition répondent largement aux exigences suivantes :
- Les expressions de compilation conditionnelle sont traitées comme des valeurs longues signées , et ces expressions sont évaluées à l’aide des mêmes règles que les expressions en C++.
- Les expressions doivent être de type intégral et ne peuvent inclure que des constantes entières, des constantes caractère et l'opérateur defined.
- Les expressions ne peuvent pas utiliser sizeof ou un opérateur de conversion de type.
- Il se peut que l'environnement cible ne puisse pas représenter toutes les plages d'entiers.
- La traduction représente le type int identique au type long, et unsigned int identique à unsigned long.
- Le traducteur peut traduire les constantes caractère en un ensemble de valeurs de code différentes de l'ensemble de l'environnement cible. Pour déterminer les propriétés de l'environnement cible, vérifiez les valeurs des macros de LIMITS.H dans une application développée pour l'environnement cible.
- L'expression ne doit effectuer aucune interrogation de l'environnement et doit rester isolée par rapport aux détails d'implémentation sur l'ordinateur cible.
Exemples
Cette section contient des exemples qui montrent comment utiliser des directives de préprocesseur de compilation conditionnelle.
Utilisation de l’opérateur défini
L’exemple suivant montre l’utilisation de l’opérateur défini. Si l’identificateur CREDIT est défini, l’appel à la fonction de crédit est compilé. Si l’identificateur DEBIT est défini, l’appel à la fonction de débit est compilé. Si aucun identificateur n’est défini, l’appel à la fonction printerror est compilé. Notez que « CREDIT » et « credit » sont des identificateurs distincts en C et C++, car leurs cas sont différents.
#if defined(CREDIT)
credit();
#elif defined(DEBIT)
debit();
#else
printerror();
#endif
Utilisation de directives #if imbriquées
L’exemple suivant montre comment imbriquer des directives #if. Cet exemple suppose qu’une constante symbolique nommée DLEVEL a été définie précédemment. Les directives #elif et #else sont utilisées pour effectuer l’un des quatre choix, en fonction de la valeur de DLEVEL. La constante STACK est définie sur 0, 100 ou 200, selon la définition de DLEVEL. Si DLEVEL est supérieur à 5, STACK n’est pas défini.
#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
Utiliser pour inclure des fichiers d’en-tête
Une utilisation courante de la compilation conditionnelle consiste à empêcher plusieurs inclusions du même fichier d'en-tête. En C++, où les classes sont souvent définies dans les fichiers d’en-tête, les constructions de compilation conditionnelle peuvent être utilisées pour empêcher plusieurs définitions. L’exemple suivant détermine si la constante symbolique EXAMPLE_H est définie. Si c’est le cas, le fichier a déjà été inclus et n’a pas besoin d’être retraité ; Si ce n’est pas le cas, la constante EXAMPLE_H est définie pour indiquer cet EXEMPLE. H a déjà été traité.
#if !defined( EXAMPLE_H )
#define EXAMPLE_H
class Example
{
...
};
#endif // !defined( EXAMPLE_H )