Команды условной компиляции используются для формирования программы в зависимости от возможностей компилятора, ОС, пожеланий по реализуемой функциональности.
Основной формой условной компиляции является\
``#if `` `"условие"`\
`"текст"_1`\
``#elif `` `"условие"`\
`"текст"_2`\
``#else``\
`"текст"_3`\
``#endif``
где ``#elif`` и ``#else`` являются опциональными, ``#elif`` можно повторяться, а `"условие"` может включать логические операции ``&&``, ``||`` и `!`, операции сравнения целых и символьных констант и проверки определен ли макрос в форме: ``defined `` `"имя"`. К выражению применяются макросы по рассмотренным ранее правилам.
В программу вставляется тот `"текст"_i`, для которого условие истинно.
Также есть две упрощенные формы команды для условий:
1. ``#ifdef `` `"имя"`\
``#elifdef `` `"имя"`\
проверяет, что макрос `"имя"` определен (сокращение от ``#if defined `` `"имя"`);
2. ``#ifndef `` `"имя"`\
``#elifndef `` `"имя"`\
проверяет, что макрос `"имя"` не определен (сокращение от ``#if !defined `` `"имя"`);
Команда ``#include`` позволяет подключить к программе заголовочный файл. Если имя заголовочного файла написано в ``<>``, то поиск этого файла выполняется только в каталогах, указанных в настройках компилятора. Если имя файла написано в ``""``, то поиск сначала ведется в текущем каталоге, а затем в каталогах, указанных в настройках компилятора.
Для предотвращения повторного подключения файла можно использовать условную компиляцию. Например, заголовочный файл ``module1.h`` должен содержать следующий текст:
```c
#ifndef _INCLUDE_MODULE1
#define _INCLUDE_MODULE1
... // заголовки функций, определение inline-функций и объявление глобальных переменных
#endif
```
Большинство компиляторов поддерживают специальную команду, обеспечивающую подключение файла не более 1 раза:\
``#pragma once``\
При использовании этой команды заголовочный файл ``module1.h`` выглядит так:
```c
#pragma once
... // заголовки функций, определение inline-функций и объявление глобальных переменных
```
Команда ``#pragma`` предназначена для управления настройками компилятора, в стандарте определяются только настройки для вычислений с плавающей точкой, разработчики компилятора могут добавлять собственные.
Команды\
``#error `` `"сообщение"`\
``#warning`` `"сообщение"`\
позволяют вывести предупреждение и сообщение об ошибке компиляции.
Команды\
``#line `` `"номер_строки"`\
``#line `` `"номер_строки"` "`"имя_файла"`"\
заставляют компилятор считать, что следующая строка имеет указанный номер и находится в указанном файле. Обычно используется генераторами программ, которые частично изменяют код,
чтобы компилятор мог вывести правильный номер строки и имя файла в сообщениях об ошибках компиляции.