Системное программирование. Конспект лекций


Заголовок макроопределения


Макроопределение должно как-то выделяться в программе, поэтому оно всегда начинается с заголовка.

Заголовок имеет формат, подобный следующему:

имя_макрокоманды MACRO список формальных параметров

имя_макрокоманды является обязательным компонентом. При макровызове это имя употребляется в поле мнемоники оператора. Имена макроопределений, имеющихся в программе, должны быть уникальны. Обычно при распознавании макровызова поиск по имени макрокоманды ведется сначала среди макроопределений имеющихся в программе, а затем (если в программе такое макроопределение не найдено) - в библиотеках макроопределений. Таким образом, имя макрокоманды, определенной в программе, может совпадать с именем макрокоманды, определенной в библиотеке, в этом случае макрокоманда, определенная в программе, заменяет собой библиотечную.

Формальные параметры играют ту же роль, что и формальные параметры процедур/функций. При обработке макровызова вместо имен формальных параметров в теле макроопределения подставляются значения фактических параметров макровызова.

В развитых Макроязыках возможны три формы задания параметров: позиционная, ключевая и смешанная. При использовании позиционной формы соответствие фактических параметров формальным определяется их порядковым номером. (Позиционная форма всегда применяется для подпрограмм).

Пример:

Заголовок макроопределения Макровызов Результат подстановки
M1 MACRO A,B,C M1 X,Y,Z A=X, B=Y, C=Z



В позиционной форме количество и порядок следования фактических параметров макровызова должны соответствовать списку формальных параметров в заголовке макроопределения. При использовании ключевой формы каждый фактический параметр макровызова задается в виде:

имя_параметра=значение_параметра

В таком же виде они описываются и в списке формальных параметров, но здесь значение_параметра может опускаться. Если значение_параметра в списке формальных параметров не опущено, то это - значение по умолчанию. В макровызове параметры могут задаваться в любом порядке, параметры, имеющие значения по умолчанию, могут опускаться.



Пример:





Заголовок макроопределения Макровызов Результат подстановки
M1 MACRO A=Q,B=,C=R M1 C=Z,B=X A=Q, B=X, C=Z

В смешанной форме первые несколько параметров подчиняются правилам позиционной формы, а остальные - ключевые.

Пример:

Заголовок макроопределения Макровызов Результат подстановки
M1 MACRO A,B,C=Q,D=,E=R M1 X,Y,Z,D=T,E=S A=X,B=Y,C=Q,D=T,E=S

В некоторых Макропроцессорах имена параметров начинаются с некоторого отличительного признака (например, амперсанда - &), чтобы Макропроцессор мог отличить "свои" имена (имена, подлежащие обработке при обработке макроопределения) от имен, подлежащих обработке Ассемблером. Для Макропроцессоров, которые мы отнесли к категории сильносвязанных такой признак может и не быть необходимым, так как такой Макропроцессор обрабатывает как свои имена, так и имена Ассемблера. В любом случае возникает проблема распознавания имени в теле макроопределения. Например, если макроопределение имеет формальный параметр &P, а в макровызове указано для него фактическое значение 'X', то как должна обрабатываться подстрока '&PA' в теле макроопределения? Должна ли эта подстрока быть заменена на 'XA' или оставлена без изменений?

Логика, которой следует большинство Макропроцессоров в этом вопросе, такова. &PA является именем в соответствии с правилами формирования имен. Поэтому оно не распознается как имя &P и остается без изменений. Если мы хотим, чтобы подстановка в этой подстроке все-таки произошла, следует поставить признак, отделяющий имя параметра от остальной части строки. Обычно в качестве такого признака используется точка - '.': '&P.A' заменяется на 'XA'.


Содержание раздела