Inclusion conditionnelle
Le préprocesseur permet la compilation conditionnelle de certaines parties du fichier source. Ce comportement est contrôlé par les directives #if, #else, #elif, #ifdef, #ifndef et #endif.
Syntaxe
#if expression
|
|||||||||
#elif expression
|
|||||||||
#ifdef expression
|
|||||||||
#ifndef expression
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
Explication
Le bloc préprocesseur d'inclusion conditionnelle commence par #if, #ifdef ou #ifndef et se termine par la directive #endif. Il peut comprendre un certain nombre de directives #elif, et éventuellement une unique directive #else. Tous les blocs d'inclusion conditionnelle internes sont traités séparément.
Chacune des directives #if, #elif, #else, #ifdef et #ifndef opère jusqu'à la prochaine directive #elif, #else ou #endif n'appartenant pas à un bloc conditionnel préprocesseur interne.
Les directives #if, #ifdef et #ifndef testent la condition spécifiée (voir ci-dessous) et si elle est évaluée à vrai, le bloc de code correspondant est compilé. Dans ce cas, le code présent entre la prochaine directive #else ou #elif et la directive #endif correspondante est ignoré.
Au contraire, si la condition est évaluée à faux, le bloc de code correspondant est ignoré et les directives #else ou #elif suivantes sont traitées (si elles sont présentes). Dans le premier cas, le bloc de code correspondant à la directive #else est toujours compilé. Dans le second, la directive #elif agit comme un #if: la condition est vérifiée, le bloc de code compilé ou ignoré selon le résultat, et les directives #elif et #else suivantes sont traitées. Dans tous les cas, le bloc d'inclusion conditionnelle se termine par la directive #endif.
Évaluation de l'état
#if, #elif
expression est une expression constante, utilisant seulement les identifiants définis en utilisant la directive #define et les littéraux. Tout identifiant qui n'est pas un littéral et qui n'est pas défini avec la directive #define est évalué à 0.
L'expression peut contenir les opérateurs unaires sous la forme defined identifiant ou defined (identifiant) qui renvoient 1 si identifiant a été défini (en utilisant #define) et 0 autrement. Le bloc de code correspondant est ignoré si expression est évaluée à la valeur zéro ; il est inclus dans le cas contraire. Si un identifiant utilisé n'est pas une constante, il est remplacé par 0.
#ifdef, #ifndef
Vérifie si l'identifiant a été défini en utilisant la directive #define.
#ifdef identifier est équivalent à #if defined( identifiant).
#ifndef identifier est équivalent à #if !defined( identifiant).
Exemple
#define ABCD 2
#include <iostream>
int main()
{
#ifdef ABCD
std::cout << "1: yes\n";
#else
std::cout << "1: no\n";
#endif
#ifndef ABCD
std::cout << "2: no1\n";
#elif ABCD == 2
std::cout << "2: yes\n";
#else
std::cout << "2: no2\n";
#endif
#if !defined(DCBA) && (ABCD < 2*4-3)
std::cout << "3: yes\n";
#endif
}
Résultat :
1: yes
2: yes
3: yes