Поделиться через


#if, #elif " #else и директивы #endif (C/C++)

#if директива с #elif" #elseи #endif директивы, компиляция элементов управления частей исходного файла.Если выражение, то создается (после #if) имеет ненулевое значение, группа линии сразу после #if директива сохраняется в переводе.

Грамматика

  • условные .
    elif-части если-частиOptдруг-частьOptendif-линия

  • если-часть .
    текст если-линии

  • если-линия .
    #if константное выражение

    #ifdef Идентификатор

    #ifndef Идентификатор

  • elif-части .
    текст elif-линии

    текст elif-линии elif-частей

  • elif-линия .
    #elif константное выражение

  • друг-часть .
    текст друг-линии

  • друг-линия .
    #else

  • endif-линия .
    #endif

Каждое #if директива в файле источника должна сопоставлению заключением #endif директива.Любое количество #elif рекомендации могут появляться между #if и #endif директивы, но по крайней мере одно #else директива разрешена.#else директива, если он имеется, должна быть последней директивой before #endif.

#if" #elif" #elseи #endif рекомендации могут быть вложены в частях текста другого #if директивы.Все вложенные #else" #elifили #endif директива принадлежит ближайший preceding #if директива.

Все директивы условный-компиляции, например #if и #ifdef, сопоставлению с заключением #endif директивы до конца файла; в противном случае выдается сообщение об ошибке.При рекомендации условный-компиляции содержатся внутри включить файлы, они удовлетворять те же условия: Разрывы не условный-компиляции в конце файла несоответствующие директивы include.

Замена выполняется внутри макроса в командной строки, выполните #elif команды, поэтому вызов макроса можно использовать в константное выражение.

Препроцессор выбирает один из заданных вхождений Текст для дальнейшей обработки.Определенный внутри блока Текст может быть любая последовательность текста.Она может занимать больше чем одну линию.Обычно Текст текст программы, имеет смысл компилятору или препроцессору.

Препроцессор обрабатывает выбранное Текст и передает ее компилятору.If Текст содержит директивы препроцессора, препроцессор выполняет эти директивы.Только блоки текста выбранных препроцессором компилировать.

Препроцессор выбирает одну Текст элемент путем оценки константное выражение за каждым #if OR #elif директива до тех пор, пока не будет найдена ненулевое значение true () константное выражение.Она выделяет весь текст (включая другие директивы препроцессора начиная с **#**до соответствующего его) #elif" #elseили #endif.

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

константное выражение константное выражение в виде целого числа со следующими дополнительными ограничениями.

  • Выражения должны иметь целочисленный тип, а также могут содержать только константы целого числа, символьные константы. defined оператор.

  • В выражении не может использоваться sizeof оператор или предоставление подходящую роль.

  • Среда целевого объекта не может иметь возможность представить все диапазоны целых чисел.

  • Перевод представляет тип int эти же, что и тип longи unsigned int эти же как unsigned long.

  • Преобразователь может выполнить преобразование символьные константы к набору значений кода отличающихся от набора для среды целевого объекта.Задать свойства среды целевого объекта, проверка значений макросов из LIMITS.H в приложение, созданное для среды целевого объекта.

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

Оператор препроцессора defined может использоваться в выражениях специальные константы, как показано в следующим синтаксисом:

задан ( identifier )

defined identifier

При этом константное выражение считается true (если не равен нулю) Идентификатор в настоящее время установлено; в противном случае условие имеет значение false (0).Идентификатор, определенный как пустой текст рассматривается как указано.defined директивы можно использовать в #if и #elif директива, но нигде else.

В следующем примере #if и #endif компиляция элемента управления директив одной из 3 вызовов функции:

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

Вызов функции к credit будет компилироваться, если идентификатор CREDIT указывает.Если идентификатор DEBIT определяет, вызов функции debit будет компилироваться.Если идентификатор не указан, то вызов printerror будет компилироваться.Обратите внимание, что CREDIT и credit заданные идентификаторы в c# и C++, так как их вариантов различаются.

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

#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

Первый #if указывает блок набора о 2 #if" #elseи #endif директивы.Обрабатывается только если первый набор директив DLEVEL > 5 - true.В противном случае выписки после #else процесс.

#elif и #else правила во втором примере используются для выполнения одно 4 вариантов, на основе значения DLEVEL.Константа STACK имеет значение 0, 100 или 200 в зависимости от определения DLEVEL.If DLEVEL больше 5, затем оператор

#elif DLEVEL > 5
display(debugptr);

будет компилироваться и STACK не указано.

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

/*  EXAMPLE.H - Example header file  */
#if !defined( EXAMPLE_H )
#define EXAMPLE_H

class Example
{
...
};

#endif // !defined( EXAMPLE_H )

Описанные выше код проверяет наличие символическая константа EXAMPLE_H указывает.Если это так, то файл уже был включен и не требует повторной обработки.Если нет - константа EXAMPLE_H определяет, чтобы пометить как EXAMPLE.H уже обработано.

См. также

Ссылки

Директивы препроцессора