◐ Shell
clean mode source ↗

Inclusion conditionnelle — cppreference.com

De cppreference.com

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 :