Conditional inclusion
Материал из cppreference.com
< cpp | preprocessor
![]() |
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google.
Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке. Щёлкните здесь, чтобы увидеть английскую версию этой страницы |
Препроцессор поддерживает условную компиляцию из частей исходного файла. Такое поведение контролируется
#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