Пространства имён
Варианты
Действия

Conditional inclusion

Материал из cppreference.com

 
 
Язык С++
Общие темы
Управление программой
Операторы условного выполнения
Операторы повторения
Операторы перехода
Функции
объявление функции
объявление лямбда-функции
шаблон функции
спецификатор inline
спецификаторы исключений (устарело)
спецификатор noexcept (C++11)
Исключения
Пространства имён
объявление пространства имён
псевдонимы пространства имён
Типы
спецификатор decltype (C++11)
Спецификаторы
cv-спецификаторы
спецификаторы продолжительности хранения
спецификатор constexpr (C++11)
спецификатор auto (C++11)
спецификатор alignas (C++11)
Инициализация
Литералы
Выражения
Утилиты
Типы
typedef-объявление
объявление псевдонима типа (C++11)
атрибуты (C++11)
Приведения типов
неявные преобразования
const_cast-преобразование
static_cast-преобразование
dynamic_cast-преобразование
reinterpret_cast-преобразование
C-подобное и функциональное приведение типов
Выделение памяти
Классы
Особые свойства классовых функций
Специальные функции-члены
Шаблоны
шаблон класса
шаблон функции
специализация шаблона
упакованные параметры (C++11)
Разное
Ассемблерные вставки
 
 
Препроцессор поддерживает условную компиляцию из частей исходного файла. Такое поведение контролируется #if, #else, #elif, #ifdef, #ifndef и #endif директивы.
Оригинал:
The preprocessor supports conditional compilation of parts of source file. This behavior is controlled by #if, #else, #elif, #ifdef, #ifndef and #endif directives.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Синтаксис

#if expression
#elif expression
#ifdef expression
#ifndef expression
#else expression
#endif expression

[править] Объяснение

Условный блок предварительной обработки начинается с #if, #ifdef или #ifndef директивы, то необязательно включает в себя любое количество #elif директивы, то необязательно включает в себя не более одного #else директивы и заканчивается директивой #endif. Любые внутренние условные блоки предварительной обработки обрабатывается отдельно.
Оригинал:
The conditional preprocessing block starts with #if, #ifdef or #ifndef directive, then optionally includes any number of #elif directives, then optionally includes at most one #else directive and is terminated with #endif directive. Any inner conditional preprocessing blocks are processed separately.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Каждый из #if, #elif, #else, #ifdef и #ifndef директивы управления блока кода до первого #elif, #else, #endif директивы, не принадлежащих к любой внутренней условных блоков предварительной обработки.
Оригинал:
Each of #if, #elif, #else, #ifdef and #ifndef directives control code block until first #elif, #else, #endif directive not belonging to any inner conditional preprocessing blocks.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
#if, #ifdef и #ifndef директивы проверить заданное условие (см. ниже), и если он истинен, компилирует контролируемого блока кода. В этом случае последующее #else и #elif директивы игнорируются. В противном случае, если указанное условие принимает ложные, контролируемый блок кода пропускается, и последующее #else или #elif директиву (если таковые имеются) обрабатывается. В первом случае блок кода контролируется #else директивы безусловно компиляции. В последнем случае, #elif директива действует, как если бы это был #if директиву: проверка состояния, компилирует или пропускается контролируемый блок кода, основанного на результате, а в последнем случае процессы последующей #elif и #else директивы. Условный блок предварительной обработки прекращается в соответствии с директивой #endif.
Оригинал:
#if, #ifdef and #ifndef directives test the specified condition (see below) and if it evaluates to true, compiles the controlled code block. In that case subsequent #else and #elif directives are ignored. Otherwise, if the specified condition evaluates false, the controlled code block is skipped and the subsequent #else or #elif directive (if any) is processed. In the former case, the code block controlled by the #else directive is unconditionally compiled. In the latter case, the #elif directive acts as if it was #if directive: checks for condition, compiles or skips the controlled code block based on the result, and in the latter case processes subsequent #elif and #else directives. The conditional preprocessing block is terminated by #endif directive.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Условия оценки

[править] #if, #elif

expression является постоянным выражением, используя только литералы и идентификаторы, определяется с помощью #define директивы. Любой идентификатор, который не буквальный, не определяются с помощью #define директиву, вычисляется в 0.
Оригинал:
The expression is a constant expression, using only литералы and identifiers, defined using #define directive. Any identifier, which is not literal, non defined using #define directive, evaluates to 0.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Выражение может содержать унарные операторы в форме defined identifier или defined (identifier), которые возвращают 1 если identifier была определена с помощью #define директивы и 0 в противном случае. Если expression вычисляет значение отличное от нуля, контролируемых блоков кода включен, и иначе пропускается. Если использовать идентификатор не является постоянным, оно заменяется 0.
Оригинал:
The expression may contain unary operators in form defined identifier or defined (identifier) which return 1 if the identifier was defined using #define directive and 0 otherwise. If the expression evaluates to nonzero value, the controlled code block is included and skipped otherwise. If any used identifier is not a constant, it is replaced with 0.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] #ifdef, #ifndef

Проверяет, является ли идентификатор была определена с помощью директивы #define.
Оригинал:
Checks if the identifier was defined using #define directive.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
#ifdef identifier по существу эквивалентно #if defined( identifier).
Оригинал:
#ifdef identifier is essentially equivalent to #if defined( identifier).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
#ifndef identifier по существу эквивалентно #if !defined( identifier).
Оригинал:
#ifndef identifier is essentially equivalent to #if !defined( identifier).
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Пример

#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
}

Вывод:

1: yes
2: yes
3: yes