Страница 36 из 56
директивах #define и #undef:
_STDC_
_FILE_
_LINE_
- 293,294 -
_DATE_
_TIME_
2. Две лексемы могут быть помещены вместе в макроопределение
с разделением их знаками ## (плюс необязательные пробелы с каждой
стороны). Препроцессор удаляет пробелы и ##, а также комбинирует
разделенные лексемы. Это может быть использовано для создания
идентификаторов, например, задав:
#define VAR(i,j) (i ## j)
при VAR(x,6) обращение вызовет подстановку x6. Это заменяет
иногда употребляемую, но не переносимую запись (i/**/j).
3. Вложенные макросы в строке макроопределения сработают
лишь тогда, когда сработает сам макрос, а не при его описании.
Это больше касается вложенных макросов #undef.
4. Символ #, помещаемый перед макроаргументом, указанном в
последовательности, преобразует аргумент в строку. При макроподс-
тановке производится замена #
- 297,298 -
Условная компиляция (K&R 12.3)
-----------------------------------------------------------------
Турбо Си поддерживает определение условной компиляции K&R с
помощью замены соответствующих строк на пустые. Игнорируемые
строки начинаются с директив #if, #ifdef, #ifndef, #else, #elif,
и #endif, также как и все некомпилируемые строки, являющиеся ре-
зультатом этих директив. Все директивы условной компиляции должны
заканчиваться в исходной программе или include файле, в которых
они начались.
Турбо Си поддерживает также оператор ANSI defined(символ).
Значение 1 (true) присваивается, если символ был предварительно
определен (с использованием #define) и затем не был отменен (с
использованием undef); в противном случае присваивается 0
(false). Так, директива
#if defined(mysym)
адекватна директиве
#ifdef mysym
Преимущество в том, что можно повторно использовать defined
в сложном выражении, стоящем за директивой #if:
#if defined(mysym) || defined(yoursym)
Наконец, Турбо Си (в отличие от ANSI) позволяет использовать
оператор sizeof в выражениях препроцессора. Так вы можете напи-
сать следующее:
#if (sizeof(void *) == 2)
#define SDATA
#else
#define LDATA
#endif
- 299,300 -
Управление строками (K&R 12.4)
-----------------------------------------------------------------
Турбо Си поддерживает определение #line, данное в K&R. Рас-
ширения макросов в #line такие же, как и в #include.
Директива error (ANSI Си 3.8.5)
-----------------------------------------------------------------
Турбо Си поддерживает директиву #error, которая упоминается
(но не определена в полной мере) в ANSI-стандарте. Ее формат:
#error errmsg
и вызывает сообщение
Fatal: filename line# Error directive: errmsg
(Фатальная ошибка: Имяфайла строка# Ошибка в директиве: errmsg)
У программистов принято включать эту директиву в условный
препроцессор, что захватывает некоторые нежелательные состояния
во время компиляции. При благоприятном исходе это состояние не
будет true. В случае, если это состояние true, вы захотите напе-
чатать сообщение об ошибке и остановить компиляцию. Вы вставляете
директиву #error внутрь условия, для которого true является неже-
лательным исходом. Например, предполагается, что #define MYVAL
принимает значения либо 0 либо 1. Вы можете тестировать на некор-
ректность значение MYVAL, если включите в ваш исходный код следу-
ющее условие:
#if (MYVAL != 0 && MYVAL != 1)
#error MYVAL должен быть определен только либо 0 либо 1
#endef
Препроцессор просматривает текст, уничтожая комментарии, а
на экран выводит оставшийся текст без просмотра для выявления
макросов.
- 301,302 -