11. Командные Строки Компилятора
независимый от остального языка синтаксис;
они могут появляться в любом месте и оказывать влияние, кото-
рое распространяется (независимо от области видимости) до
конца файла исходной программы.
Учтите, что определения const и inline дают альтернативы
для большинства использований #define.
11.1 Замена Лексем
Командная строка компилятора вида
#define идентификатор строка_лексем
вызывает замену препроцессором последующих вхождений
идентификатора, заданного строкой символов. Точка с запятой
внутри (или в конце) строки символов является частью этой
строки.
Строка вида
#define идентификатор( идентификатор , ... , идентификатор)
строка_лексем
где нет пробела между первым идентификатором и (, явля-
ется макроопределением с параметрами. Последующие вхождения
первого идентификатора с идущими за ним (, последователь-
ностью символов, разграниченной запятыми, и ), заменяются
строкой символов, заданной в определении. Каждое местоположе-
ние идентификатора, замеченного в списке параметров определе-
ния, заменяется соответствующей строкой из вызова. Фактичес-
кими параметрами вызова являются строки символов, разделенные
запятыми; однако запятые в строке, заключенной в кавычки, или
в круглых скобках не являются разделителями параметров. Число
формальных и фактических параметров должно совпадать. Строки
и символьные константы в символьной строке сканируются в по-
исках формальных параметров, но строки и символьные константы
в остальной программе не сканируются в поисках определенных
(с помощью define) идентификаторов.
В обоих случаях строка замещения еще раз сканируется в
поисках других определнных идентификаторов. В обоих случаях
длинное определение может быть продолжено на другой строке с
помощью записи \ в конце продолжаемой строки.
Командная строка вида
#undef идентификатор
влечет отмену препроцессорного определения идентификато-
ра.
11.2 Включение Файлов
Командная строка компилятора вида
#include "имя_файла"
вариант, командная строка вида
#include <имя_файла>
производит поиск только в стандартном или заданном мес-
те, и не ищет в директории исходного файла. (То, как эти мес-
та задаются, не является частью языка.)
Включения с помощью #include могут быть вложенными.
11.3 Условная Компиляция
Командная строка компилятора вида
#if выражение
проверяет, является ли результатом вычисления выражения
не-ноль. Выражение должно быть константным выражением, кото-
рые обсуждаются в #12. Кроме обычных операций С++ может ис-
пользоваться унарная операция defined. При применении к иден-
тификатору она дает значение не-ноль, если этот идентификатор
был ранее определен с помощью #define и после этого не было
отмены определения с помощью #undef; иначе ее значение 0.
Командная строка вида
#ifdef идентификатор
проверяет, определен ли идентификатор в препроцессоре в
данный момент; то есть, был ли он объектом командной строки #
define. Командная строка вида
#ifndef идентификатор
проверяет, является ли идентификатор неопределенным в
препроцессоре в данный момент.
После каждого из трех видов может стоять произвольное
количество строк, возможно, содержащих командную строку
#else
и далее до командной строки
#endif
Если проверенное условие истинно, то все строки между
#else и #endif игнорируются. Если проверенное условие ложно,
то все строки между проверкой и #else или, в случае отсутс-
твия #else, #endif, игнорируются.
Эти конструкции могут быть вложенными.
11.4 Управление Строкой
Для помощи другим препроцессорам, генерирующим программы
на С++, строка вида
#line константа "имя_файла"
отсутствует, то запомненное имя
файла не изменяется.
[Назад] [Содержание] [Вперед]
| Главная |