2.2. Макросы

На верх  Назад  Вперёд

Синтаксис макросов поход на синтаксис идентификаторов (которые через $define объявляются) или переменных. Разница в том, что макрос имеет какое-либо значение, тогда как идентификатор может быть определён или нет (для использования в $ifdef).

Кроме того, после объявления макроса, любое появление макроса в исходном коде 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.

ПРИМЕЧАНИЕ

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

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

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

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

Содержание

FPC_FULLVERSION

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

FPC_VERSION

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

FPC_RELEASE

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

FPC_PATCH

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

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

ПРИМЕЧАНИЕ

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

Начиная с версии 3.1.1, для платформ (таких как AVR) компилятор определяет несколько встроенных макросов, определяющих компановку памяти для платформы, они перечислены в таблице (2.2). Эти макросы являются целыми значениями и могут использоваться в коде и в операторах $IF.

Таблица 2.2: Компановка встроенной памяти для платформы

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

Содержание

FPC_FLASHBASE

Базовый адрес флэш-памяти.

FPC_FLASHSIZE

Размер флэш-памяти.

FPC_RAMBASE

Базовый адрес оперативной памяти.

FPC_RAMSIZE

Размер оперативной памяти.

FPC_BOOTBASE

Базовый адрес загрузочной памяти.

FPC_BOOTSIZE

Размер загрузочной памяти.

FPC_EEPROMBASE

Базовый адрес памяти EEPROM.

FPC_EEPROMSIZE

Размер памяти EEPROM.