##директивы if, elif, # else и # endif

Директивы препроцессора, управляющие компиляцией частей исходного файла.

#Если ифкондитион ...
[#елифкондитион elif...]
[#else...]
#endif

Параметры

Элемент Описание
ифкондитион
Основное условие для вычисления. Если этот параметр принимает ненулевое значение, весь текст между этой # директивой If и следующим экземпляром # директивы elif, # Else или # endif сохраняется в записи преобразования; в противном случае следующий исходный код не сохраняется.
Условие может использовать оператор препроцессора, определенный для определения, определена ли конкретная константа препроцессора или макрос. Это использование эквивалентно использованию директивы # ifdef .
Ограничения на значение параметра ифкондитион см. в разделе "Примечания".
елифкондитион [ используемых]
Другое условие для вычисления. Если параметр ифкондитион и все предыдущие # директивы elif равны нулю, и этот параметр принимает ненулевое значение, весь текст между этой # директивой elif и следующим экземпляром # # директивы elif, else или # endif сохраняется в записи преобразования; в противном случае последующий исходный код не сохраняется.
Условие может использовать оператор препроцессора, определенный для определения, определена ли конкретная константа препроцессора или макрос. Это использование эквивалентно использованию директивы # ifdef .
Ограничения на значение параметра елифкондитион см. в разделе "Примечания".

Примечания

Каждая # директива if в исходном файле должна соответствовать закрываемой # директиве endif. #Между директивами if и endif может использоваться любое число директивов elif # # , но # допускается не более одной директивы else. #Директива Else, если она есть, должна быть последней директивой перед # endif. Директивы условной компиляции, содержащиеся в включаемых файлах, должны соответствовать тем же условиям.

# # Директивы if, elif, # else и # endif могут быть вложены в текстовые части других # директив if. Каждая вложенная # # директива Else, elif или # endif принадлежит ближайшей предшествующей # директиве if.

Если ни одно из условий не имеет ненулевого значения, препроцессор выбирает текстовый блок после # директивы else. Если # предложение else пропущено и ни одно из условий не имеет ненулевого значения, то текстовый блок не выбран.

Параметры ифкондитион и елифкондитион в значительной степени соответствуют следующим требованиям.

  • Выражения условной компиляции обрабатываются как длинные значения со знаком , и эти выражения оцениваются с использованием тех же правил, что и выражения в C++.
  • Выражения должны иметь целочисленный тип и могут содержать только целочисленные константы, символьные константы и оператор defined.
  • Выражения не могут использовать sizeof или оператор приведения типа.
  • Целевая среда может быть не в состоянии представлять все диапазоны целых чисел.
  • Преобразование представляет тип int , то же, что и тип Long, и Неподписанное целое число без знака Long.
  • Транслятор может преобразовывать символьные константы в набор кодовых значений, отличающийся от набора для целевой среды. Для определения свойств целевой среды проверьте значения макросов из файла LIMITS.H в приложении, собранном для целевой среды.
  • Выражение не должно выполнять никаких запросов среды и не должно зависеть от конкретной реализации на целевом компьютере.

Примеры

В этом разделе содержатся примеры, демонстрирующие использование директив препроцессора условной компиляции.

Использование определенного оператора

В следующем примере показано использование определенного оператора. Если определен кредит идентификатора, вызывается вызов функции кредита . Если определен ДЕБЕТ идентификатора, вызывается вызов функции Debit . Если ни один из идентификаторов не определен, вызывается вызов функции принтеррор . Обратите внимание, что "Кредит" и "Кредит" — это уникальные идентификаторы в C и C++, так как их варианты различны.

#if defined(CREDIT)
    credit();
#elif defined(DEBIT)
    debit();
#else
    printerror();
#endif

Использование вложенных # директив if

В следующем примере показано, как вкладывать # директивы if. В этом примере предполагается, что символьная константа с именем ДЛЕВЕЛ была ранее определена. # # Директивы elif и Else используются для выбора одного из четырех вариантов в зависимости от значения длевел. В зависимости от определения ДЛЕВЕЛ в СТЕКе констант устанавливается значение 0, 100 или 200. Если ДЛЕВЕЛ больше 5, то стек не определен.

#if DLEVEL > 5
    #define SIGNAL  1
    #if STACKUSE == 1
        #define STACK   200
    #else
        #define STACK   100
    #endif
#else
    #define SIGNAL  0
    #if STACKUSE == 1
        #define STACK   100
    #else
        #define STACK   50
    #endif
#endif
#if DLEVEL == 0
    #define STACK 0
#elif DLEVEL == 1
    #define STACK 100
#elif DLEVEL > 5
    display( debugptr );
#else
    #define STACK 200
#endif

Использовать для включения файлов заголовков

Условная компиляция обычно используется для предотвращения нескольких включений одного и того же файла заголовка. В C++, где классы часто определяются в файлах заголовков, конструкции условной компиляции можно использовать для предотвращения нескольких определений. В следующем примере определяется, определена ли символьная константа в примере _ H. Если да, то файл уже включен и не нуждается в повторной обработке. в противном случае _ для указания этого примера определяется константа H. H уже обработан.

#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

См. также раздел

Директивы препроцессора (DirectX HLSL)