2.2. Макросы

Вверх  Предыдущий  Следующий

Синтаксис макросов поход на синтаксис идентификаторов или переменных. Разница в том, что макрос имеет значение, тогда как идентификатор может быть просто определён или не определён. Кроме того, после объявления макроса, любое появление макроса в исходном коде Pascal будет заменено значением этого макроса (подобно тому, как выполняется поддержка макросов в препроцессоре С ). Если требуется поддержка макросов, то должен быть использован переключатель командной строки -Sm (должен быть включен), или вместо него можно использовать директиву:

{$MACRO ON}

В противном случае макрос будет рассматриваться как идентификатор.

Определение макроса в программе выполняется также, как определение идентификатора: в операторе препроцессора

{$define}.
{$define ident:=expr}

Учтите, что в компиляторах версии до 0.9.8 оператор присваивания для макросов был не :=, а =.

Если компилятор обнаружит ident в последующей части исходного кода, то он заменит его на expr. Эта замена работает рекурсивно, то есть если компилятор выполнит один макрос, он будет смотреть результат выражения и определять, не нужно ли выполнить ещё одну замену. Это означает, что нужно осторожно использовать макросы, так как может получиться бесконечный цикл.

Здесь приводятся два примера, которые иллюстрируют работу макросов:

{$define sum:=a:=a+b;}

sum {Будет заменено на 'a:=a+b;' Обратите внимание на отсутствие точки с запятой}

{$define b:=100}
sum {Будет выполнено рекурсивно a:=a+100;}

Предыдущий пример может быть выполнен не так:

{$define sum:=a:=a+b;}

sum {Будет заменено на 'a:=a+b;' Обратите внимание на отсутствие точки с запятой}

{$define b=sum} { НЕ ДЕЛАЙТЕ ЭТОГО !!!}
sum { Будет бесконечный рекурсивный цикл… }

На моей системе последний пример привёл к ошибке «кучи», вызвав завершение работы компилятора с ошибкой 203.

ПРИМЕЧАНИЕ

Макросы, объявленные в интерфейсной части модуля, не доступны за пределами этого модуля! Они могут использоваться только как нотации или в условной компиляции.

По умолчанию компилятор предоставляет три макроса, содержащих номер версии, номер выпуска («релиза») и номер «патча». Они перечислены в таблице 2.1.

Таблица 2.1. Предопределённые макросы

Идентификатор

Содержание

FPC_FULLVERSION

Целочисленный номер версии компилятора.

FPC_VERSION

Номер версии компилятора.

FPC_RELEASE

Номер выпуска.

FPC_PATCH

Номер «патча».

Макрос FPC_FULLVERSION содержит номер версии, который всегда использует две цифры для номеров версий «релиза» и «патча». Это означает, что версия 2.3.1 в результате будет FPC_FULLVERSION=20301. Это число позволяет более просто определить минимальный номер версии.

ПРИМЕЧАНИЕ

Не забывайте, что поддержка макросов выключена по умолчанию. Она должна быть включена опцией командной строки -Sm или директивой {$MACRO ON}.