Inclusion conditionnelle
Le prprocesseur permet la compilation conditionnelle de certaines parties du fichier source. Ce comportement est contrl par les directives #if, #else, #elif, #ifdef, #ifndef et #endif.
Syntaxe
#if expression
|
|||||||||
#elif expression
|
|||||||||
#ifdef expression
|
|||||||||
#ifndef expression
|
|||||||||
#else
|
|||||||||
#endif
|
|||||||||
Explication
Le bloc prprocesseur 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 traits sparment.
Chacune des directives #if, #elif, #else, #ifdef et #ifndef opre jusqu' la prochaine directive #elif, #else ou #endif n'appartenant pas un bloc conditionnel prprocesseur interne.
Les directives #if, #ifdef et #ifndef testent la condition spcifie (voir ci-dessous) et si elle est value vrai, le bloc de code correspondant est compil. Dans ce cas, le code prsent entre la prochaine directive #else ou #elif et la directive #endif correspondante est ignor.
Au contraire, si la condition est value faux, le bloc de code correspondant est ignor et les directives #else ou #elif suivantes sont traites (si elles sont prsentes). 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 vrifie, le bloc de code compil ou ignor selon le rsultat, et les directives #elif et #else suivantes sont traites. 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 dfinis en utilisant la directive #define et les littraux. Tout identifiant qui n'est pas un littral et qui n'est pas dfini avec la directive #define est valu 0.
L'expression peut contenir les oprateurs unaires sous la forme defined identifiant ou defined (identifiant) qui renvoient 1 si identifiant a t dfini (en utilisant #define) et 0 autrement. Le bloc de code correspondant est ignor si expression est value la valeur zro ; il est inclus dans le cas contraire. Si un identifiant utilis n'est pas une constante, il est remplac par 0.
#ifdef, #ifndef
Vrifie si l'identifiant a t dfini 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
}
Rsultat :
1: yes
2: yes
3: yes