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