- Директивы условной компиляции
- Работа
Директивы условной компиляции
Группа директив препроцессора, позволяющих в зависимости от значения определенных символов (макросов) изменять содержимое текста программы: #if, #ifdef, #ifndef, #else, #elif и #endif. Эти директивы сложные, т.е. состоят из более чем одной строки. Начинаются всегда с одной из первых трех директив, завершаются всегда директивой #endif. Оставшиеся директивы #else и #elif -дополнительные, могут и отсутствовать.
Эти директивы, как по синтаксису, так и по смыслу, очень близки к оператору if и служат для проверки определенного условия, и, в зависимости от истинности этой проверки, исключения указанных строк программы из процесса компиляции. Пояснить сказанное проще всего на примерах.
#if (VER > 5)
//строки, которые будут обработаны только в случае, если VER > 5
int x = 10;
#endif
В примере строка int x = 10 будет включена в текст программы только в том случае, если значение ранее описанного символа VER будет больше 5. Если же символ VER не определен вообще, или его значение менее 5 - строка будет удалена препроцессором.
#if (VER > 5)
int x = 10;
#else long x = 10;
#endif
В этом примере в текст программы будет введено определение переменной int x только для случаев, когда VER > 5, а в противном переменная х будет иметь тип long.
#if (VER > 5)
int x = 10;
#elif (VER > 3)
char x = 10;
#else long x = 10;
#endif
Этот пример показывает, как изменяется тип переменной х в зависимости от значения VER:
Значение VER | Тип переменной х |
6 и более | int |
4 или 5 | char |
3 и менее | long |
Количество директив #elif может быть любым.
Если не требуется анализировать значение символа, а достаточно лишь убедиться в том, что он определен, используется такой вариант:
#ifdef VER
int x = 10;
#endif
Если символ VER определен «выше по тексту» программы -определение переменной включается в текст программы, иначе -исключается.
Директива #ifndef позволяет что-то включить в текст программы, если символ НЕ описан ранее. Обе директивы могут содержать блок #else для указания альтернативного включения текста.
Не нужды упоминать, что указанные директивы могут «охватывать» любое количество строк программы, в том числе любые другие директивы препроцессора. Главное, о чем нельзя забывать: директивы препроцессора не могут использоваться для контроля содержимого переменных! То есть определить, существует или нет переменная var при помощи директивы #ifdef var можно, но будет ошибочной попытка проверить ее значение директивой #if var == 15.