Главная » Статьи » Програмування » C [ Добавить статью ]

RUS Уроки по программированию на языке С (Условная компиляция.)

Условная компиляция.

Директивы условной компиляции, позволяют генерировать программный код в зависимости от выполнимости определенных условий. Условная компиляция обеспечивается в языке 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";
 }
Категория: C | Добавил: DEN-SHP (06.11.2012)
Просмотров: 820 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]