Директивы препроцессора Cи условной компиляции

Условная компиляция дает возможность программисту компилировать только нужные участки кода в зависимости от установленных условий программного кода. 

Основные директивы препроцессора Си

Подключение файлов
#include — Вставляет текст из указанного файла.

Макроопределения
#define — Задаёт макроопределение (макрос) или символическую константу.
#undef — Отменяет предыдущее определение символической константы.

Условная компиляция
#if — Осуществляет условную компиляцию, если константное выражение истинно.
#ifdef — Осуществляет условную компиляцию, если символическая константа была определена.
#ifndef — Осуществляет условную компиляцию, если символическая константа не определена.
#elif — Выполняется, если предыдущие условия конструкции if или elif ложны.
#else — Выполняется, если все условия конструкции if или elif ложны.
#endif — Конец ветки условной компиляции.

#if defined — Тоже самое, что и #ifdef.*
#if !defined — Тоже самое, что и #ifndef.*
*Обе эти конструкции можно использовать для визуального облегчения восприятия сложных условий, когда веток конструкций несколько. Например так можно обозначить главный блок, внутри которого несколько иных условий.

У каждой директивы #if в исходном файле должна быть соответствующая закрывающая директива #endif.

#if Константное выражение
  Если истинно..
#elif константное выражение
  Или..
#elif константное выражение
  Или..
#else
  Или..
#endif

Между директивами #if и #endif может располагаться любое количество директив #elif, однако допускается не более одной директивы #else. Если присутствует директива #else, она должна быть последней перед директивой #endif.

Диагностика
#line — Препроцессор изменяет номер текущей строки и имя компилируемого файла.
#error — Выдача диагностического сообщения и прерывает компиляцию.
#warning — Выдает диагностическое сообщение, но не прерывает компиляцию.

Дополнительные опции для компилятора
#pragma — Дополнительные опции, зависящие от конкретного компилятора. В каждом компиляторе существуют свои опции.

Пример условной компиляции для разных компиляторов

В примере приведены условия для компиляторов С/С+ - IAR Embedded Workbench, CodeVisionAVR и AVR GCC.

/* ------------------------------------------------------------------------ */
#if defined __IAR_SYSTEMS_ICC__  /* if IAR */
/* ------------------------------------------------------------------------ */

	/* Тут ваш код для компилятора IAR */

/* ------------------------------------------------------------------------ */
#elif __CODEVISIONAVR__ /* if CodeVisionAVR */
/* ------------------------------------------------------------------------ */

	/* Тут ваш код компилятора CodeVisionAVR */

/* ------------------------------------------------------------------------ */
#else   /* if default, then development for avr-gcc/avr-libc */
/* ------------------------------------------------------------------------ */

	/* Тут ваш код для компилятора avr-gcc/avr-libc */

#endif /* default development */

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *