Условная компиляция дает возможность программисту компилировать только нужные участки кода в зависимости от установленных условий программного кода.
Основные директивы препроцессора Си
Подключение файлов
#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 */