Здавалка
Главная | Обратная связь

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



Директивы условной компиляции, позволяют генерировать программный код в зависимости от выполнимости определенных условий. Условная компиляция обеспечивается в языке 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, теперь, рассмотрим несколько примеров.







©2015 arhivinfo.ru Все права принадлежат авторам размещенных материалов.