Главная » Статьи » Програмування » C | [ Добавить статью ] |
|
#if <константное_выражение> #ifdef <идентификатор> #ifndef <идентификатор> #else#endif#elif |
Первые три команды выполняют проверку условий, две следующие - позволяют определить диапазон действия проверяемого условия. Последняя команда используется для организации проверки серии условий. Общая структура применения директив условной компиляции такова:
#if/#ifdef/#ifndef <константное_выражение или идентификатор> <текст_1> #else //необязательная директива <текст_2> #endif |
- Конструкция#else <текст_2> не обязательна.
- Текст_1 включается в компилируемый текст только при истинности проверяемого условия.
- Если условие ложно, то при наличии директивы #else на компиляцию передается текст_2.
- Если директива #else отсутствует, то весь текст от #if до #endif при ложном условии опускается.
Различие между формами команд #if состоит в следующем.
1. В первой из перечисленных директив #if проверяется значение константного целочисленного выражения. Если оно отлично от нуля, то считается, что проверяемое условие истинно. Например, в результате выполнения директив:
#if 5+12 <текст_1> #endif |
текст_1 всегда будет включен в компилируемую программу.
2. В директиве #ifdefпроверяется, определен ли с помощью команды #define к текущему моменту идентификатор, помещенный после #ifdef. Если идентификатор определен, то текст_1 используется компилятором.
3. В директиве #ifndef проверяется обратное условие - истинным считается неопределенность идентификатора, т.е. тот случай, когда идентификатор не был использован в команде #define или его определение было отменено командой #undef.
Для организации мульти ветвлений во время обработки препроцессором исходного текста программы введена директива
#elif <константное_выражение> |
является сокращением конструкции #else#if.
Структура исходного текста с применением этой директивы такова:
#if <константное_выражение_1> <текст_1> #elif <константное_выражение_2> <текст_2> #elif <константное_выражение_3> <текст_3> . . . . #else <текст_N> #endif |
- Препроцессор проверяет вначале условие в директиве #if, если оно ложно (равно 0) - вычисляет константное_выражение_2, если оно равно О - вычисляется константное_выражение_3 и т.д.
- Если все выражения ложны, то в компилируемый текст включается текст для случая #else.
- В противном случае, т.е. при появлении хотя бы одного истинного выражения (в #if или в #elif), начинает обрабатываться текст, расположенный непосредственно за этой директивой, а все остальные директивы не рассматриваются.
- Таким образом, препроцессор обрабатывает всегда только один из участков текста, выделенных командами условной компиляции.
A, теперь, рассмотрим несколько примеров.
Пример 1. Простая директива условного включения.
#ifdef ArrFlg int Arr[30]; #endif |
Если во время интерпретации директивы определено макроопределение ArrFlg, то приведенная запись дает генерацию выражения
int Arr[30]; |
В противном случае не будет генерировано ни одно выражение.
Пример 2.
#include <iostream> using namespace std; #define ArrFlg 1 void main () { #ifdef ArrFlg int Arr[30]; #else cout << "Array is not defined!"; #endif } |
Пример 3. Директива условного включения с альтернативой
#if a+b==5 cout << 5; #else cout << 13; #endif |
Если выражение a+b==5 представляет величину, отличную от 0, то будет сгенерирована команда cout << 5;, в противном случае будет сгенерирована команда cout << 13;.
Пример 4. Составная директива условного включения
#include <iostream> using namespace std; //++++++++++++++++++++++ #define Alfa 5 //++++++++++++++++++++++ #if Alfa*5>20 void main () //++++++++++++++++++++++ #if Alfa==4 int Arr[2]; #elif Alfa==3 char Arr[2]; #else { #endif //++++++++++++++++++++++ #if 0 cout<<"One"; #else cout<<"Two"; #endif //++++++++++++++++++++++ #else cout<<"Test"; #endif //++++++++++++++++++++++ } |
Интерпретация приведенной записи приведет к генерации
void main () { cout<<"Kaja"; } |
Всего комментариев: 0 | |