КулЛиб - Классная библиотека! Скачать книги бесплатно
Всего книг - 714295 томов
Объем библиотеки - 1412 Гб.
Всего авторов - 275021
Пользователей - 125157

Новое на форуме

Новое в блогах

Впечатления

чтун про серию Вселенная Вечности

Все четыре книги за пару дней "ушли". Но, строго любителям ЛитАниме (кароч, любителям фанфиков В0) ). Не подкачал, Антон Романович, с "чувством, толком, расстановкой" сделал. Осталось только проду ждать, да...

Рейтинг: 0 ( 0 за, 0 против).
Влад и мир про Лапышев: Наследник (Альтернативная история)

Стиль написания хороший, но бардак у автора в голове на нечитаемо, когда он начинает сочинять за политику. Трояк ставлю, но читать дальше не буду. С чего Ленину, социалистам, эссерам любить монархию и терпеть черносотенцев,убивавших их и устраивающие погромы? Не надо путать с ворьём сейчас с декорациями государства и парламента, где мошенники на доверии изображают партии. Для ликбеза: Партии были придуманы ещё в древнем Риме для

  подробнее ...

Рейтинг: 0 ( 0 за, 0 против).
Влад и мир про Романов: Игра по своим правилам (Альтернативная история)

Оценку не ставлю. Обе книги я не смог читать более 20 минут каждую. Автор балдеет от официальной манерной речи царской дворни и видимо в этом смысл данных трудов. Да и там ГГ перерождается сам в себя для спасения своего поражения в Русско-Японскую. Согласитесь такой выбор ГГ для приключенческой фантастики уже скучноватый. Где я и где душонка царского дворового. Мне проще хлев у своей скотины вычистить, чем служить доверенным лицом царя

  подробнее ...

Рейтинг: +1 ( 1 за, 0 против).
kiyanyn про серию Вот это я попал!

Переписанная Википедия в области оружия, изредка перемежающаяся рассказами о том, как ГГ в одиночку, а потом вдвоем :) громил немецкие дивизии, попутно дирижируя случайно оказавшимися в кустах симфоническими оркестрами.

Нечитаемо...


Рейтинг: +2 ( 3 за, 1 против).
Влад и мир про Семенов: Нежданно-негаданно... (Альтернативная история)

Автор несёт полную чушь. От его рассуждений уши вянут, логики ноль. Ленин был отличным экономистом и умел признавать свои ошибки. Его экономическим творчеством стал НЭП. Китайцы привязали НЭП к новым условиям - уничтожения свободного рынка на основе золота и серебра и существование спекулятивного на основе фантиков МВФ. И поимели все технологии мира в придачу к ввозу промышленности. Сталин частично разрушил Ленинский НЭП, добил его

  подробнее ...

Рейтинг: +6 ( 6 за, 0 против).

Расширенный макропроцессор для языка C/C++ [Антон Евгеньевич Москаль kouzdra] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

Îëüãà Êîíîíîâà, Àíòîí Ìîñêàëü, Îëåã Ïëèññ

Ðàñøèðåííûé ìàêðîïðîöåññîð äëÿ ÿçûêà C/C++

Ñîäåðæàíèå

1. Ëåêñèêà

2

2. Îïåðàòîðû ìàêðîïðîöåññîðà

4

3. Ïðàâèëà ìàêðîïîäñòàíîâêè

7

4. Âñòðîåííûå ìàêðîñû

8

5. Íåêîòîðûå ïðèåìû èñïîëüçîâàíèÿ ìàêðîïðîöåññîðà:

11

6. Ðàáîòà ñ ìàêðîïðîöåññîðîì

15

7. Íåñîâìåñòèìîñòè è èçâåñòíûå îøèáêè

16

Àííîòàöèÿ
Îïèñûâàåìûé ìàêðîïðîöåññîð ÿâëÿåòñÿ â îñíîâíîì ðàñøèðåíèåì ñòàíäàðòíîãî ìàêðîïðîöåññîðà
è ìîæåò èñïîëüçîâàòüñÿ êàê âìåñòî íåãî, òàê è â ñî÷åòàíèè ñ íèì. Ñòðîãîñòè ðàäè ñëåäóåò îòìåòèòü,
÷òî èìååòñÿ äîâîëüíî ìíîãî ìåëêèõ íåñîâìåñòèìîñòåé ñî ñòàíäàðòíûì ïðåïðîöåññîðîì. Êàê ïîêàçàë
îïûò åãî èñïîëüçîâàíèÿ, ýòè íåñîâìåñòèìîñòè ïðàêòè÷åñêè íå âûçûâàþò ïðîáëåì. Óñòðàíèòü èõ íå
ïðåäñòàâëÿåòñÿ âîçìîæíûì ïî ñîîáðàæåíèÿì âíóòðåííåé ëîãèêè.
Îñíîâíûìè ðàñøèðåíèÿìè ÿâëÿþòñÿ:



âîçìîæíîñòü îïèñàíèÿ ìíîãîñòðî÷íûõ ìàêðîêîìàíä, êîòîðûõ ñàìè ìîãóò ñîäåðæàòü îïåðàòîðû
ìàêðîïðîöåññîðà.



âîçìîæíîñòü èñïîëüçîâàòü â ìàêðîêîìàíäàõ ïðîèçâîëüíîå ÷èñëî àðãóìåíòîâ è ïðîèçâîëüíûå ðàçäåëèòåëè ìåæäó íèìè.



âîçìîæíîñòü èñïîëüçîâàòü ðàçëè÷íûå òèïû ñêîáîê (



âîçìîæíîñòü ïåðåãðóçêè ìàêðîîïðåäåëåíèé ïî òèïó ñêîáîê è ÷èñëó àðãóìåíòîâ.



öèêëû ïî ñïèñêàì è ïðèñâàèâàíèÿ çíà÷åíèé ïåðåìåííûì

Ñ++ ñ èñïîëüçîâàíèåì ñàìîãî ñåáÿ. Â íàñòîÿùåå âðåìÿ ñóùåñòâóþò
MS-DOS, OS/2 è Linux.

Ìàêðîïðîöåññîð íàïèñàí íà
åãî ðåàëèçàöèè äëÿ

[ ], ( ), { }, #( #))

1.

Ëåêñèêà

Ìàêðîïðîöåññîð ÿâëÿåòñÿ ëåêñè÷åñêè îðèåíòèðîâàííûì. Ëåêñèêà â îñíîâíîì ñîîòâåòñòâóåò ñòàíäàðòíîé
ëåêñèêå
ñèìâîëà

C . Äîáàâëåíû íîâûå ëåêñåìû: " ..", "@". â íà÷àëå èäåíòèôèêàòîðîâ äîïóñêàåòñÿ èñïîëüçîâàíèå
$. Êðîìå òîãî, ðàçðåøàåòñÿ îáîçíà÷åíèå ñèìâîëà ïåðåâîäà ñòðîêè ïðè ïîìîùè êîìáèíàöèè \n.

Òàêèì îáðàçîì:

#

ifdef

__BC__

\n

#

include

"stdio.h" \n #

endif

ïî ñâîåìó äåéñòâèþ ýêâèâàëåíòíî

#

ifdef

__BC__

#

#

endif

include

"stdio.h"

Äàííàÿ âîçìîæíîñòü ïîëåçíà â íåêîòîðûõ ñëó÷àÿõ äëÿ óâåëè÷åíèÿ ÷èòàåìîñòè òåêñòà.
Êðîìå òîãî,

\

ìîæåò áûòü èñïîëüçîâàí äëÿ ïîäàâëåíèÿ ðàñïîçíàâàíèÿ ìàêðîîïåðàòîðîâ. Òàê:

\#include

"xxx.xx"

áóäåò âûâåäåí â âûõîäíîé ïîòîê áåç èçìåíåíèé, íî ñ óäàëåííûì ñèìâîëîì

1.1.
1.1.1.

\.

Îñíîâíûå êîíñòðóêöèè
Ðàçäåëèòåëè

Ðàçäåëèòåëè èñïîëüçóþòñÿ äëÿ ðàçäåëåíèÿ ôîðìàëüíûõ è ôàêòè÷åñêèõ àðãóìåíòîâ ìàêðîñîâ.

::=
, | ; | / | < | > | − | % | == | ! =
↑ | & | && | ∗ | + | = | = |
: | ? | / | . | .. | ! | | | || | + = | − = |
% = | ↑= | & = | | = | ∗ = | / =

1.1.2.

Ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ

Äàííàÿ êîíñòðóêöèÿ èñïîëüçóåòñÿ â îïèñàíèÿõ ìàêðîñîâ è îïåðàòîðå #

with.

::=
|
;
Òî÷êà ñ çàïÿòîé îáîçíà÷àåò, ÷òî ñîîòâåòñòâóþùèé ñïèñîê ôàêòè÷åñêèõ ïàðàìåòðîâ òîæå äîëæåí çàâåðøàòüñÿ òî÷êîé ñ çàïÿòîé, êîòîðàÿ âõîäèò â íåãî (òî åñòü çàìåíÿåòñÿ ïðè ìàêðîïîäñòàíîâêå).

2

::=
|
() |
[]
|
{} |
#(#)
::=
|

|


Ðàçäåëèòåëü ïåðåä ñïèñêîì ôîðìàëüíûõ ïàðàìåòðîâ èñïîëüçóåòñÿ äëÿ çàäàíèÿ ðàçäåëèòåëÿ â ñëó÷àå, åñëè ôîðìàëüíûé ïàðàìåòð îäèí (ýòî ìîæåò áûòü íåîáõîäèìî äëÿ ïðàâèëüíîãî îïðåäåëåíèÿ ÷èñëà
ïàðàìåòðîâ, â îñîáåííîñòè ïðè èñïîëüçîâàíèè ïåðåãðóæåííûõ ìàêðîñîâ)

::=
|
...
Ìíîãîòî÷èå â êîíöå ñïèñêà îáîçíà÷àåò, ÷òî ïîñëåäíèé ïàðàìåòð ìîæåò àññîöèèðîâàòüñÿ ñ ïðîèçâîëüíûì (íåïóñòûì) ñïèñêîì àðãóìåíòîâ.

::=
|


Âñå ðàçäåëèòåëè â ñïèñêå äîëæíû áûòü ðàçëè÷íû.

1.1.3.

Ñïèñîê ôàêòè÷åñêèõ ïàðàìåòðîâ

Ñïèñîê ôàêòè÷åñêèõ ïàðàìåòðîâ âûãëÿäèò òðàäèöèîííî, íî èìååò ñëåäóþùèå âàæíûå îòëè÷èÿ:
Ìîãóò èñïîëüçîâàòüñÿ âñå ÷åòûðå âèäà ñêîáîê. Ïðè âûäåëåíèè àðãóìåíòîâ åäèíûì àðãóìåíòîì ñ÷èòàþòñÿ íå òîëüêî êîíñòðóêöèè çàêëþ÷åííûå â êðóãëûå ñêîáêè, íî è çàêëþ÷åííûå â ñêîáêè äðóãèõ òèïîâ.
Ýòî ÿâëÿåòñÿ îòêëîíåíèåì îò ñåìàíòèêè ñòàíäàðòíîãî ìàêðîïðîöåññîðà. Åñëè îïåðàíä îêðóæåí ñêîáêàìè

#(



#),

òî îíè óäàëÿþòñÿ ïåðåä ïîäñòàíîâêîé ýòîãî îïåðàíäà. Óäàëåíèå ïðîèçâîäèòñÿ òîëüêî ñ

ñàìûìè âíåøíèìè ñêîáêàìè (è òîëüêî â òîì ñëó÷àå, åñëè îíè îêðóæàþò âåñü àðãóìåíò - ñ àðãóìåíòà
âèäà

#(a, b, c#)d

ñêîáêè óäàëåíû íå áóäóò. Ñêîáêè

#(



#)

èñïîëüçóþòñÿ äëÿ ïðåäîòâðàùåíèÿ àíàëèçà

âíóòðåííåé ñòðóêòóðû ïàðàìåòðîâ ïðè âûçîâå ìàêðîêîìàíäû.
Êðîìå òîãî, â ñïèñîê ôàêòè÷åñêèõ ïàðàìåòðîâ ìîæåò âêëþ÷àòüñÿ çàâåðøàþùàÿ òî÷êà ñ çàïÿòîé.

3

2.

Îïåðàòîðû ìàêðîïðîöåññîðà

2.1.

Îïåðàòîð îïèñàíèÿ ìàêðîñà (#macro)
::=
#macro

#endm



 ýòî òåêñò, ñîäåðæàùèé ñáàëàíñèðîâàííîå êîëè÷åñòâî ñêîáîê #

macro

 #

endm. Íè

îäèí èç îïåðàòîðîâ, ñîäåðæàùèõñÿ â òåëå ìàêðîñà â ïðîöåññå îáðàáîòêè ìàêðîîïðåäåëåíèÿ íå âûïîëíÿåòñÿ.

2.2.

Îïåðàòîð #define

Îïåðàòîð #

define

èìååò îáû÷íûé ñèíòàêñèñ, çà èñêëþ÷åíèåì òîãî, ÷òî ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ

ìîæåò èìåòü îáùèé âèä. Ñ òî÷êè çðåíèÿ ñåìàíòèêè ýòîò îïåðàòîð ìîæåò ðàññìàòðèâàòüñÿ êàê ñîêðàùåííûé âàðèàíò îïåðàòîðà #

macro.

Åãî èñïîëüçîâàíèå ìîæåò áûòü ðåêîìåíäîâàíî êàê ñðåäñòâî äëÿ

äîñòèæåíèÿ ñîâìåñòèìîñòè îòäåëüíûõ ôðàãìåíòîâ ñî ñòàíäàðòíûì ìàêðîïðîöåññîðîì è äëÿ ñîêðàùåíèÿ
çàïèñè ïðîñòåéøèõ ìàêðîñîâ.
Èñïîëüçîâàíèå â íåì äðóãèõ ìàêðîîïåðàòîðîâ íå ðåêîìåíäóåòñÿ, òàê êàê ñåìàíòèêà òàêèõ ìàêðîñîâ
ìîæåò îêàçàòüñÿ íåî÷åâèäíîé.

2.3.

Îïåðàòîðû #ifdef, #ifndef, #if, #else, #elif, #endif, #error

Äàííûå îïåðàòîðû èìåþò îáû÷íóþ ñåìàíòèêó ñ òåì îòëè÷èåì, ÷òî âû÷èñëåíèÿ â àðèôìåòè÷åñêèõ âûðàæåíèÿõ â îïåðàòîðå #

if

ïðîèçâîäÿòñÿ íàä ñòðîêîâûì ïðåäñòàâëåíèåì (è âîçìîæíî èñïîëüçîâàíèå ñòðî-

êîâûõ ôóíêöèé è ìàêðîñîâ).

2.4.

Îïåðàòîð #for

Îïåðàòîð #

for

ñëóæèò äëÿ ïåðåáîðà ýëåìåíòîâ ñïèñêà è èìååò âèä:

::=
#for

#endf |
#for#by

#endf


ÿâëÿåòñÿ èìåíåì ïåðåìåííîé öèêëà.



óìîë÷àíèþ   ,) íà êîìïîíåíòû. Ñåìàíòèêà îïåðàòîðà #

for

ðàçäåëÿåòñÿ ðàçäåëèòåëåì (ïî

ýêâèâàëåíòíà ñåìàíòèêå îïèñàíèÿ ìàêðîñà

ñ îäíèì ïàðàìåòðîì è ïîñëåäóþùèì âûçîâîì ýòîãî ìàêðîñà äëÿ êàæäîãî ýëåìåíòà ñïèñêà.

2.5.

Îïåðàòîð #undef

Ýòîò îïåðàòîð îòëè÷àåòñÿ îò ñòàíäàðòíîãî òåì, ÷òî âìåñòî îäíîãî èäåíòèôèêàòîðà ìîæåò áûòü çàäàí
ñïèñîê èäåíòèôèêàòîðîâ, ðàçäåëåííûõ çàïÿòîé.
Åùå îäíî îòëè÷èå ñîñòîèò â òîì, ÷òî îïåðàòîðû #

define è #macro äëÿ îäíîèìåííûõ ìàêðîñîâ íå
undef, ñîîòâåòñòâåííî, óäàëÿåò ïîñëåäíåå çíà-

çàìåùàþò ñòàðîå îïðåäåëåíèå, à îáðàçóþò ñòåê. Îïåðàòîð #

÷åíèå èç ñòåêà, äåëàÿ äîñòóïíûì ïðåäûäóùåå. Ýòî î÷åíü óäîáíî äëÿ îðãàíèçàöèè ëîêàëüíûõ ïåðåìåííûõ
è ìàêðî.

4

2.6.

Îïåðàòîð #setm
::=
#setm

#ends

Ýòîò îïåðàòîð óñòàíàâëèâàåò íîâîå çíà÷åíèå òåëà ìàêðî ñ èìåíåì



, êîòîðàÿ äîëæíà áûòü

óæå ñóùåñòâóþùåé ìàêðî áåç ïàðàìåòðîâ.

2.7.

Îïåðàòîð #set
::= #set

Ýòîò îïåðàòîð ïîõîæ íà #

setm, çà èñêëþ÷åíèåì òîãî, ÷òî íîâîå çíà÷åíèå íå ìîæåò ñîäåðæàòü íåñêîëü-

êî ñòðîê. Äåéñòâèå îïåðàòîðà

#set
ìîæåò áûòü âûðàæåíî ñëåäóþùèì îáðàçîì:

#setm
\
#ends

2.8.

Îïåðàòîð #include

Åäèíñòâåííûì îòëè÷èåì îïåðàòîðà #

include

îò ñòàíäàðòíîãî ÿâëÿåòñÿ òî, ÷òî â ðåæèìå -a ïðè îòñóò-

ñòâèè óêàçàííîãî â îïåðàòîðå ôàéëà âìåñòî âûäà÷è äèàãíîñòèêè îá îøèáêå ïðîèñõîäèò âûâîä â âûõîäíîé
ôàéë ñàìîãî îïåðàòîðà #

include.

Ýòà îïöèÿ ïðèìåíÿåòñÿ ïðè èñïîëüçîâàíèè ðàñøèðåííîãî ìàêðîãåíå-

ðàòîðà â ïàðå ñî ñòàíäàðòíûì.

2.9.

Îïåðàòîð #while
::=
#while

#endw

Ýòîò îïåðàòîð âûïîëíÿåò



äî òåõ ïîð, ïîêà âûïîëíÿåòñÿ óñëîâèå

5



.

2.10.

Îïåðàòîð #with
::=
#with
\


#end_with |
#with

\


#welse

#end_with
Îïåðàòîð #

with âûïîëíÿåò ðàçáîð

è ïîäñòàâëÿåò èõ â



â ñîîòâåòñòâèè ñî



êàê â òåëî ìàêðîñà. Ïðè íåñîîòâåòñòâèè ñïèñêà ôàêòè÷åñêèõ ïà-

ðàìåòðîâ ñïèñêó ôîðìàëüíûõ ïàðàìåòðîâ âûïîëíÿåòñÿ



, à ïðè åå îòñóòñòâèè  âûäàåòñÿ

äèàãíîñòèêà îá îøèáêå.

2.11.

Îïåðàòîðû #act, #deact

::=
#act
::= #deact




deact çàïðåùàåò ïîäñòàíîâêó ìàêðîñîâ ñ èìåíåì óêàçàííûì â íåì äî ñëåäóþùåãî îïåðàact. Ýòîò îïåðàòîð â îñíîâíîì èñïîëüçóåòñÿ äëÿ ýìóëÿöèè òðåáóåìîé ñòàíäàðòîì ANSI ñåìàíòèêè
îïåðàòîðà # define : åñëè çàäàí êëþ÷ - n (çàïðåùàþùèé ðåêóðñèâíóþ ïîäñòàíîâêó # define -ìàêðîñîâ), òî
òåëî êàæäîé ìàêðîêîìàíäû, îïðåäåëåííîé ïðè ïîìîùè îïåðàòîðà # define , îáðàìëÿåòñÿ ýòèìè äèðåêòèÎïåðàòîð #

òîðà #

âàìè.

2.12.

Îïåðàòîðû #on, #off
::= #on
::= #off

Îïåðàòîð #

off

çàïðåùàåò âûäà÷ó ãåíåðèðóåìîãî òåêñòà â âûõîäíîé ïîòîê, îïåðàòîð #

on

 âîçîáíîâ-

ëÿåò åå.

2.13.

Îïåðàòîð #hide
::= #hide

Ýòîò îïåðàòîð ìîæåò èñïîëüçîâàòüñÿ òîëüêî âíóòðè ìàêðîâûçîâà. Åãî èñïîëüçîâàíèå ïîäàâëÿåò âûäà÷ó ñòðîêè, îòíîñÿùåéñÿ ê ýòîìó ìàêðîñó â òðàññå îøèáêè. Åãî èñïîëüçîâàíèå öåëåñîîáðàçíî â ïîëíîñòüþ
îòëàæåííûõ ìàêðîñàõ, êîòîðûå íå ìîãóò áûòü ïðè÷èíîé îøèáêè íè ïðè êàêèõ çíà÷åíèÿõ âõîäíûõ ïàðàìåòðîâ.
Êëþ÷ - f îòìåíÿåò äåéñòâèå âñåõ îïåðàòîðîâ #

hide.

6

3.

Ïðàâèëà ìàêðîïîäñòàíîâêè

Ïîäñòàíîâêà ìàêðîñà ïðîèçâîäèòñÿ ñëåäóþùèì îáðàçîì: â òåëå ìàêðîñà âñå âõîæäåíèÿ ôîðìàëüíûõ ïàðàìåòðîâ çàìåíÿþòñÿ íà ôàêòè÷åñêèå, åñëè ôîðìàëüíûé ïàðàìåòð ïðåäâàðÿëñÿ ñèìâîëîì
êëþ÷àåòñÿ â êàâû÷êè â ñîîòâåòñòâèè ñ ëåêñè÷åñêèìè ñîãëàøåíèÿìè ÿçûêà
ëåêñåìû (èëè äðóãîãî ôîðìàëüíîãî ïàðàìåòðà) ñèìâîëàìè

##,

C,

#,

òî îí çà-

ïàðàìåòð, îòäåëåííûé îò

êîíêàòåíèðóåòñÿ ñ íèì. Ïîñëå âûïîëíå-

íèÿ ïîäñòàíîâêè íà ìåñòî âûçîâà ìàêðîêîìàíäû (âìåñòå ñ ôàêòè÷åñêèìè ïàðàìåòðàìè) ïîäñòàâëÿåòñÿ
ðåçóëüòàò ïîäñòàíîâêè.
 îòëè÷èå îò ñòàíäàðòíîãî ìàêðîïðîöåññîðà, â ôàêòè÷åñêèõ ïàðàìåòðàõ ìàêðîñîâ ìàêðîïîäñòàíîâêà
íå ïðîèçâîäèòñÿ. Ïðè îáðàáîòêå òåêñòà, ïðåäíàçíà÷åííîãî äëÿ îáðàáîòêè ñòàíäàðòíûì ìàêðîïðîöåññîðîì, ýòî ïðèâîäèò ê îòëè÷èÿì òîëüêî â ñëó÷àå èñïîëüçîâàíèÿ îïåðàöèé

#

è

##

ñ òàêèìè ïàðàìåòðàìè.

 îñòàëüíûõ ñëó÷àÿõ ýòè ïîäñòàíîâêè âûïîëíÿþòñÿ ïðè ïîâòîðíîì ïðîñìîòðå ðåçóëüòàòà ìàêðîïîäñòàíîâêè. Äëÿ âûíóæäåíèÿ íåìåäëåííîé ïîäñòàíîâêè â ñïèñêå ôàêòè÷åñêèõ ïàðàìåòðîâ ñëóæèò îïåðàöèÿ

@.

3.1.

Ïðèíóäèòåëüíàÿ îäíîêðàòíàÿ ïîäñòàíîâêà ìàêðîñîâ ( @)

Ñèìâîë

@

â ñïèñêå ôàêòè÷åñêèõ ïàðàìåòðîâ, çà êîòîðûì ñëåäóåò âûçîâ ìàêðîñà, îáîçíà÷àåò: ÷òî íåîá-

õîäèìî íåìåäëåííî ïîäñòàâèòü ýòîò ìàêðîñ. Ñàì ñèìâîë

@

ïðè ýòîì óäàëÿåòñÿ. Ïðè ýòî ñëåäóåò èìåòü â

âèäó, ÷òî ïðè ïîâòîðíîì ñêàíèðîâàíèè òåêñòà ïîäñòàíîâêè ïðîèçâîäèòñÿ áóäóò òîëüêî â òîì ñëó÷àå, åñëè
îíè òàêæå ïðåäâàðÿþòñÿ ñèìâîëîì

3.2.

@.

Ïðàâèëà âûáîðà ïåðåãðóæåííûõ ìàêðîñîâ

Êîãäà â òåêñòå âñòðå÷àåòñÿ èìÿ àêòèâíîãî ìàêðîñà, òî ïðîèçâîäèòñÿ ïîèñê ïåðâîãî ìàêðî ñ òèïîì ñêîáêè,
òàêèì æå êàê îòêðûâàþùàÿ ñêîáêà ñðàçó çà âûçîâîì ìàêðîñà. Åñëè òàêîãî íå íàøëîñü (èëè åñëè çà èìåíåì
ìàêðî èäåò íå ñêîáêà), òî ïðîèçâîäèòñÿ ïîèñê ìàêðîñà áåç ïàðàìåòðîâ.
Åñëè ìàêðîñ ñ ñîîòâåòñòâóþùèì òèïîì ñêîáîê áûë íàéäåí, òî ñïèñîê ôàêòè÷åñêèõ ïàðàìåòðîâ ðàçáèðàåòñÿ â ñîîòâåòñòâèè ñ ðàçäåëèòåëåì ýòîãî ìàêðîñà. Ïîñëå ýòîãî ïðîèçâîäèòñÿ ïîèñê ìàêðîñà ñ äàííûì
èìåíåì, òèïîì ñêîáîê, ðàçäåëèòåëåì è ÷èñëîì ïàðàìåòðîâ. Ïåðâûé (â ïîðÿäêå, îáðàòíîì ïîðÿäêó èõ
îïðåäåëåíèÿ) ïîäîøåäøèé ìàêðîñ âûçûâàåòñÿ.

3.3.

Ïðàâèëà êîíêàòåíàöèè ñòðîê
#

Åñëè â ðåçóëüòàòå ïðèìåíåíèÿ îïåðàòîðà

ê ïàðàìåòðó ìàêðîêîìàíäû ïîëó÷åííàÿ ñòðîêà íåïîñðåä-

ñòâåííî ñîñåäñòâóåò ñ äðóãîé ñòðîêîé, òî ïðîèçâîäèòñÿ óäàëåíèå ïàðû ïîäðÿä ñòîÿùèõ êàâû÷åê è ýòè
ñòðîêè îáúåäèíÿþòñÿ. Ýòî íå âàæíî ïðè èñïîëüçîâàíèè ïðåïðîöåññîðà ñ òðàíñëÿòîðàìè ñ ÿçûêà
ñêîëüêó

C

C,

ïî-

ñàì ñêëåèâàåò òàêèå ñòðîêè, íî ìîæåò áûòü íåîáõîäèìî â äðóãèõ ñëó÷àÿõ (íàïðèìåð ïðè

ãåíåðàöèè  .M D  ôàéëà äëÿ
ñòðîêîé è îïåðàòîðîì

GCC ).

×òîáû ïîäàâèòü ýòîò ýôôåêò, äîñòàòî÷íî âñòàâèòü ïðîáåë ìåæäó

#id.

Òàêèì îáðàçîì â ðåçóëüòàòå òðàíñëÿöèè

#with (x) (456)
”123”#x”789”
”123 − #x ”789”
#end_with
áóäåò ïîëó÷åí òåêñò:

”123456789”
”123 − ”456 − ”789”

7

4.

Âñòðîåííûå ìàêðîñû

 ìàêðîïðîöåññîðå ðåàëèçîâàí íàáîð âñòðîåííûõ ìàêðîêîìàíä, ïîçâîëÿþùèé âûïîëíÿòü äîñòàòî÷íî
ñëîæíûå îïåðàöèè ïî ïðåîáðàçîâàíèþ òåêñòîâ.

4.1.

Ìàêðîêîìàíäà $cmp

Ìàêðîêîìàíäà

$cmp (S1, S2)

îñóùåñòâëÿåò ñðàâíåíèå ñâîèõ àðãóìåíòîì. Ðåçóëüòàòîì ýòîãî ìàêðîâûçîâà

áóäåò

• 0,

åñëè

S1 = S2

• 1,

åñëè

S1 > S2

• −1,

4.2.

åñëè

S1 < S2

Ìàêðîêîìàíäà $len

Ðåçóëüòàòîì ìàêðîêîìàíäû

4.3.

$len (arg)

ÿâëÿåòñÿ ÷èñëî, ðàâíîå äëèíå åå àðãóìåíòà â ëèòåðàõ.

Ìàêðîêîìàíäà $upper

Ðåçóëüòàòîì ìàêðîêîìàíäû

$upper (arg)

ÿâëÿåòñÿ ñòðîêà

arg ,

â êîòîðîé âñå áóêâû íèæíåãî ðåãèñòðà

arg ,

â êîòîðîé âñå áóêâû âåðõíåãî ðåãèñòðà

çàìåíåíû íà ñîîòâåòñòâóþùèå áóêâû âåðõíåãî ðåãèñòðà,

4.4.

Ìàêðîêîìàíäà $lower

Ðåçóëüòàòîì ìàêðîêîìàíäû

$lower (arg)

ÿâëÿåòñÿ ñòðîêà

çàìåíåíû íà ñîîòâåòñòâóþùèå áóêâû íèæíåãî ðåãèñòðà,

4.5.

Màêðîêîìàíäà $f ind

Äàííàÿ ìàêðîêîìàíäà èìååò äâà àðãóìåíòà. Ðåçóëüòàòîì âûïîëíåíèÿ ìàêðîâûçîâà

pat â ñòðîêó str
$f ind ÿâëÿåòñÿ −1.

åòñÿ íîìåð ïîçèöèè ïåðâîãî âõîæäåíèÿ ñòðîêè

pat

íå âõîäèò â

4.6.

str,

òî çíà÷åíèåì ìàêðîñà

$f ind (str, pat) ÿâëÿ0). Åñëè

(íóìåðàöèÿ ïîçèöèé íà÷èíàåòñÿ ñ

Ìàêðîêîìàíäà $char

Àðãóìåíòîì ìàêðîêîìàíäû

$char (code)

ÿâëÿåòñÿ ÷èñëî. Ðåçóëüòàòîì ìàêðîêîìàíäû ÿâëÿåòñÿ ëèòåðà, ñ

êîäîì ðàâíûì ýòîìó ÷èñëó. Ñëåäóåò ñîáëþäàòü îñòîðîæíîñòü â èñïîëüçîâàíèè ýòîãî ìàêðîâûçîâà: íàïðèìåð ïîÿâëåíèå â òåêñòå óïðàâëÿþùèõ ñèìâîëîâ, íàïðèìåð ëèòåð c êîäàìè

0

è

026 (Ctrl/Z)

ïðèâåäåò

ê òðóäíîïðåäñêàçóåìûì ýôôåêòàì.

4.7.

Ìàêðîêîìàíäà $ascii
h
i
$ascii (arg , pos ). Åå ðåçóëüòàòîì ÿâëÿåòñÿ ASCII-êîä ñèìâîëà ñ íîìåðîì
pos îïóùåí, òî âûäàåòñÿ êîä ïåðâîãî ñèìâîëà ñòðîêè arg .

Äàííàÿ ìàêðîêîìàíäà èìååò âèä

pos

4.8.

èç ñòðîêè

arg .

Åñëè

Ìàêðîêîìàíäà $substr

Ìàêðîêîìàíäà

$substr (str, pos, len) âûðåçàåò èç àðãóìåíòà str ïîäñòðîêó, íà÷èíàþùóþñÿ ñ ïîçèöèè pos
0) ñ äëèíîé len. Íàïðèìåð, ðåçóëüòàòîì ìàêðîâûçîâà $substr (123456789, 3, 2)

(íóìåðàöèÿ ïîçèöèé íà÷èíàåòñÿ ñ
áóäåò ñòðîêà

45.

8

4.9.

Ìàêðîêîìàíäà $repeat
$repeat

Ìàêðîêîìàíäà

èìååò äâà àðãóìåíòà. Åå ðåçóëüòàòîì ÿâëÿåòñÿ âòîðîé àðãóìåíò, ïîâòîðåííûé

ñòîëüêî ðàç, ñêîëüêî óêàçàíî ïåðâûì îïåðàíäîì. Íàïðèìåð ðåçóëüòàòîì ìàêðîâûçîâà
áóäåò ñòðîêà

4.10.

$repeat (3, 239, +)

239, +239, +239, +

Maêðîêîìàíäà $press
$press ()

Ìàêðîêîìàíäà

óäàëÿåò èç íà÷àëà è êîíöà ñâîåãî àðãóìåíòà âñå ïðîáåëû, òàáóëÿöèè è

ïåðåâîäû ñòðîêè. Ýòà ìàêðîêîìàíäà î÷åíü ÷àñòî íåîáõîäèìà äëÿ îáåñïå÷åíèÿ êîððåêòíîé ðàáîòû ìàêðîîïðåäåëåíèé (îñîáåííî òåõ, êîòîðûå äîïóñêàþò ìíîãîñòðî÷íûå àðãóìåíòû)

4.11.

Ìàêðîêîìàíäà $uniqid

äàííàÿ ìàêðîêîìàíäà ïðè êàæäîì ñâîåì âûçîâå ïîðîæäàåò íîâûé èäåíòèôèêàòîð âèäà __

nnnn

4.12.

ID_nnnn, ãäå

- óíèêàëüíûé íîìåð èç ÷åòûðåõ ñèìâîëîâ.

Ìàêðîêîìàíäà $eval
$eval

Ìàêðîêîìàíäà

ñëóæèò äëÿ âû÷èñëåíèÿ çíà÷åíèÿ ñâîåãî àðãóìåíòà. Îíà èìååò åäèíñòâåííûé àð-

ãóìåíò, êîòîðûé äîëæåí áûòü ïðàâèëüíî ïîñòðîåííûì àðèôìåòè÷åñêèì âûðàæåíèåì. Êàê ïðàâèëî îíà
èñïîëüçóåòñÿ â ïðåïðîöåññîðíûõ öèêëàõ è äðóãèõ ìåñòàõ, ãäå íåæåëàòåëüíî îáðàçîâàíèå ñëèøêîì äëèííîãî âûðàæåíèÿ. Íàïðèìåð, ðåçóëüòàòîì ìàêðîðàñøèðåíèÿ öèêëà

#define sum 0
#for i (1, 2, 3, 4, 5)
#set sum (sum) + (i)
#endf
sum
áóäåò òåêñò

(((((0) + (1)) + (2)) + (3)) + (4)) + (5),

÷òî, âî-ïåðâûõ, ãðîìîçäêî, âî-âòîðûõ, ìîæåò áûòü

íåïðèåìëåìî ëèáî ïî ñîîáðàæåíèÿì ñëîæíîñòè (äëèíà òàêîãî âûðàæåíèÿ â áîëåå ñëîæíîé êîíñòðóêöèè
ìîæåò ðàñòè ýêñïîíåíöèàëüíî), ëèáî åñëè ïîëó÷åííûé ðåçóëüòàò íåîáõîäèìî èñïîëüçîâàòü èìåííî êàê
÷èñëî (íàïðèìåð, êàê ñóôôèêñ èäåíòèôèêàòîðà). Ñ èñïîëüçîâàíèåì ôóíêöèè

$eval

ýòî ìîæåò áûòü ïåðå-

ïèñàíî ñëåäóþùèì îáðàçîì:

#define sum 0
#for i (1, 2, 3, 4, 5)
#set sum $eval((sum) + (i))
#endf
sum
è ðåçóëüòàòîì áóäåò

15.

Îòìåòèì, ÷òî òîãî æå ðåçóëüòàòà ìîæíî áûëî äîáèòüñÿ è èñïîëüçîâàâ

$eval

â

ïîñëåäíåé ñòðîêå ( $eval (sum)), íî ýòî íåñêîëüêî õóæå, òàê êàê ïðîìåæóòî÷íûé ðåçóëüòàò ìîæåò èìåòü
áîëüøóþ äëèíó (âïðî÷åì, â äàííîì ïðèìåðå ýòî ðàçëè÷èå íåñóùåñòâåííî).
Òàêæå ñëåäóåò îáðàòèòü âíèìàíèå íà òî, ÷òî èñïîëüçîâàíèå ñèìâîëà
çíà÷åíèÿ ìàêðî
ñêè

1.

sum

íå òðåáóåòñÿ. Â àðãóìåíòå ìàêðî

$eval

@

äëÿ âûíóæäåíèÿ ïîäñòàíîâêè

ìàêðîïîäñòàíîâêà ïðîèçâîäèòñÿ àâòîìàòè÷å-

1 íà ñàìîì äåëå ýòó ìàêðîïîäñòàíîâêó äåëàåò ïðîöåäóðà, êîòîðàÿ ðåàëèçóåò âû÷èñëåíèå âûðàæåíèÿ, ýòà ïðîöåäóðà ÿâëÿåòñÿ â òî÷íîñòè òîé æå, êîòîðàÿ èñïîëüçóåòñÿ äëÿ âû÷èñëåíèÿ âûðàæåíèé â îïåðàòîðàõ # if è #while

9

4.13.

Ìàêðîêîìàíäà $write

Ìàêðîêîìàíäà

$write (, ) ñîçäàåò íîâûé ôàéë ñ èìåíåì (îíî äîëæíî áûòü çàêëþ.

÷åíî â êàâû÷êè) è çàïèñûâàåò â íåãî ñòðîêó

4.14.

Ìàêðîêîìàíäà $append

Ìàêðîêîìàíäà

$append (, )

äîáàâëÿåò ñòðîêó



ê ôàéëó ñ èìåíåì



(è ñîçäàåò

ôàéë, åñëè îí íå ñóùåñòâóåò).

4.15.

Ìàêðîêîìàíäà $hex

Ìàêðîêîìàíäà

$hex ()

âû÷èñëÿåò çíà÷åíèå âûðàæåíèÿ

âîçâðàùàåò åãî øåñòíàäöàòèðè÷íîå ïðåäñòàâëåíèå. Ïðåôèêñ

0x



$eval è
a − f ïðåä-

ïðè ïîìîùè ôóíêöèè

íå ïðèñîåäèíÿåòñÿ è öèôðû

ñòàâëÿþòñÿ áóêâàìè íèæíåãî ðåãèñòðà.

4.16.

Ìàêðîêîìàíäà $HEX

Ìàêðîêîìàíäà

$HEX ()

òîæäåñòâåííà ïðåäûäóùåé ìàêðîêîìàíäå ñ òåì îòëè÷èåì, ÷òî äëÿ ïðåä-

ñòàâëåíèÿ ÷èñëà èñïîëüçóþòñÿ áóêâû âåðõíåãî ðåãèñòðà.

4.17.

Ïðî÷èå ìàêðîîïðåäåëåíèÿ



__ST DC __  çíà÷åíèå äàííîãî ìàêðîñà âñåãäà ðàâíî



__LIN E __  çíà÷åíèåì äàííîãî ìàêðîñà ÿâëÿåòñÿ íîìåð òåêóùåé ñòðî÷êè



__F ILE __  çíà÷åíèåì äàííîãî ìàêðîñà ÿâëÿåòñÿ èìÿ òåêóùåãî ôàéëà

10

1

5.

Íåêîòîðûå ïðèåìû èñïîëüçîâàíèÿ ìàêðîïðîöåññîðà:

5.1.

Ðàçáîð ñëîæíûõ ïàðàìåòðîâ

Äîâîëüíî ÷àñòî îêàçûâàåòñÿ óäîáíûì ðåàëèçîâàòü áîëåå ñëîæíûé ñèíòàêñèñ äëÿ ïàðàìåòðîâ ìàêðî. Ýòî
îáû÷íî óìåíüøàåò ÷èñëî ñêîáîê è çíà÷èòåëüíî ïîâûøàåò ÷èòàåìîñòü òåêñòà. Çäåñü ìû ïðèâåäåì ïðèìåð
ìàêðîñà, êîòîðûé ïîçâîëÿåò çàïèñûâàòü îïèñàíèÿ ïåðåìåííûõ â ñòèëå ÿçûêà

P ascal:

#macro DclV ar [dcls; ...];
#for dcl #by ; (dcls)
#with (ids : type) (dcl)
#for id (ids)
type id;
#endf
#end_with
#endf
#endm
 ðåçóëüòàòå ìàêðîâûçîâà

DclV ar [a, b, c : int; c1, c2 : char];
int
int
int
char
char

5.2.

áóäåò ñãåíåðèðîâàí òåêñò:

a;
b;
c;
c1;
c2;

Èñïîëüçîâàíèå ëîêàëüíûõ ìàêðîïåðåìåííûõ

×àñòî áûâàåò íåîáõîäèìî èñïîëüçîâàòü âíóòðè ìàêðîñà ëîêàëüíûå ïåðåìåííûå (íàïðèìåð, äëÿ íàêîïëåíèÿ ðåçóëüòàòà àðèôìåòè÷åñêèõ âû÷èñëåíèé. Òåîðåòè÷åñêè ìîæíî îïèñàòü ïåðåìåííóþ ãëîáàëüíî è
èñïîëüçîâàòü åå, íî ïðè èñïîëüçîâàíèè ðåêóðñèâíûõ ìàêðîîïðåäåëåíèé ýòî ìîæåò áûòü íåïðèåìëåìî.
Ïðèâîäèì ïðèìåð ìàêðîñà, êîòîðûé âû÷èñëÿåò ñóììó ñâîèõ àðãóìåíòîâ:

#macro sum (list, ...)
#define result 0
#for item (list)
#set result $eval (result + item)
#endf
result
#undef result
#endm
Ñëåäóåò îáðàòèòü âíèìàíèå íà òî, ÷òî #

5.3.

undef

result ñòîèò ïîñëå èñïîëüçîâàíèÿ çíà÷åíèÿ result.

Ìàêðîêîìàíäû ñ íåñêîëüêèìè ñïèñêàìè ïàðàìåòðîâ

Äîâîëüíî ÷àñòî âîçíèêàåò æåëàíèå îïèñàòü ìàêðîêîìàíäó, êîòîðàÿ áóäåò ñïîñîáíà âûáðàòü íåñêîëüêî
ïîäðÿä èäóùèõ ñïèñêîâ ïàðàìåòðîâ. Íàïðèìåð, ÷òîáû ïîëó÷èòü ñèíòàêñèñ íàïîäîáèå îïåðàòîðà while
ÿçûêà

C,

ãäå óñëîâèå çàïèñûâàåòñÿ â êðóãëûõ ñêîáêàõ, à òåëî  â ôèãóðíûõ ñêîáêàõ ñðàçó æå ïîñëå

óñëîâèÿ. Ê ñîæàëåíèþ ñèíòàêñèñ



íå ïîçâîëÿåò ýòî ñäåëàòü íàïðÿìóþ. Îäíàêî

åñòü ñïîñîá äîáèòüñÿ àíàëîãè÷íîãî ýôôåêòà. Äëÿ åãî äåìîíñòðàöèè ìû îïèøåì ìàêðîñ äëÿ îðãàíèçàöèè
öèêëà ïî âñåì ýëåìåíòàì íåêîòîðîãî ñïèñêà. Ïðåäïîëàãàåòñÿ, ÷òî èìÿ òèïà ñïèñêà

2

List

2:

Ïðè èñïîëüçîâàíèè òðàíñëÿòîðà GCC â äàííîé ñèòóàöèè î÷åíü óäîáíî èñïîëüçîâàòü îïåðàòîð typeof )

11

#macro f orAll (var = list_head)
#macro __f orAll {body; ...}
#undef __f orAll
{
List ∗ var = (list_head);
while (var 6= N U LL)
{
{body}
var = var → next;
}
}
#endm
__f orAll
#endm
Âûçîâ ýòîãî ìàêðîñà âûãëÿäèò ñëåäóþùèì îáðàçîì:

int sum = 0;
f orAll (p = list)
{
sum += p → value;
}
â ðåçóëüòàòå áóäåò ïîëó÷åí òåêñò

int sum = 0
{
List ∗ p = (list);
while (p 6= N U LL)
{
{ sum += p → list; }
p = p → next;
}
}
Ñëåäóåò îòìåòèòü èñïîëüçîâàííûé ïðèåì: îïðåäåëåíèå ëîêàëüíîãî ìàêðîñà, êîòîðûé

íà÷èíàåò ñâîþ

ðàáîòó ñ òîãî, ÷òî îòìåíÿåò ñâîå îïðåäåëåíèå (ýòî êîððåêòíî, òàê êàê â ìîìåíò îáðàáîòêè îïåðàòîðà
#

undef

5.4.

òåëî ìàêðîñà óæå ïîäñòàâëåíî è äàëüøå îí íå íóæåí.

Îïèñàíèå ìàêðîñîâ, èìèòèðóþùèõ áëî÷íóþ ñòðóêòóðó

Ñïîñîá, èñïîëüçîâàííûé äëÿ îïèñàíèÿ îïåðàòîðà forAll, ïðèâåäåííûé âûøå èìååò íåñêîëüêî ñóùåñòâåííûõ íåäîñòàòêîâ: Îí ñâÿçàí ñ èñïîëüçîâàíèåì äëèííîãî àðãóìåíòà ìàêðîêîìàíäû, ÷òî â ñî÷åòàíèè ñ òåì,
÷òî ìàêðîïðîöåññîð íå ñïîñîáåí âûäàâàòü òî÷íóþ ïîçèöèþ îøèáêè âíóòðè ïàðàìåòðîâ ìàêðîêîìàíä (îí
âñåãäà óêàçûâàåò íà íà÷àëî ïàðàìåòðà â èñõîäíîì òåêñòå) êðàéíå çàòðóäíÿåò ðàáîòó. Êðîìå ýòîãî, äàííûé
ñïîñîá æåñòêî ôèêñèðóåò ñòðóêòóðó îïåðàòîðà (íàïðèìåð ñìîäåëèðîâàòü ïîäîáíûì îáðàçîì if -then-else ñ
íåîáÿçàòåëüíûì îïåðàòîðîì else óæå çàòðóäíèòåëüíî. Ïîýòîìó ÷àñòî áûâàåò óäîáåí äðóãîé ñïîñîá ðåøåíèÿ òîé æå çàäà÷è:

12

#macro f orAll (var = list_head)
#with (break _label) (@$uniqid)
{
List ∗ var = (list_head);
while (var 6= N U LL)
{
{
#macro break;
goto break _label;
#endm
#macro endF orAll
#undef endF orAll, break
}
var = var → next;
}
break _label :;
}
#endm
#end_with
#endm
Òîãäà åãî èñïîëüçîâàíèå áóäåò âûãëÿäåòü òàê:

int sum = 0;
f orAll (p = list)
if (p → value < 0) break;
sum += p → value;
endF orAll
Ñëåäóåò îòìåòèòü, ÷òî ýòî ìàêðî áóäåò íîðìàëüíî ðàáîòàòü è ïðè âëîæåííûõ åãî èñïîëüçîâàíèÿõ. Ïî
ïîâîäó ìàêðîêîìàíäû break ñëåäóåò îòìåòèòü òî, ÷òî ýòîò ìàêðîñ áóäåò íîðìàëüíî ðàáîòàòü ñ ó÷åòîì
âîçìîæíîé âëîæåííîñòè forAll (è äàæå â ñëó÷àå, êîãäà îí àíàëîãè÷íûì îáðàçîì îïðåäåëÿåòñÿ â äðóãèõ
ìàêðîñàõ òîãî æå òèïà), íî ïðè èñïîëüçîâàíèè âíóòðè forAll îáû÷íîãî öèêëà ÿçûêà
ïåðåêðîåò âîçìîæíîñòü èñïîëüçîâàíèÿ îïåðàòîðà break ÿçûêà

5.5.

C.

C

ýòîò îïåðàòîð

Èñïîëüçîâàíèå îïåðàòîðà #with äëÿ çàïîìèíàíèÿ çíà÷åíèé

Äîâîëüíî òèïè÷íûì ïðèåìîì ïðè íà÷àëå ðàáîòû ñ ìàêðîïðîöåññîðîì ÿâëÿåòñÿ èñïîëüçîâàíèå îïåðàòîðà
#

define

äëÿ çàïîìèíàíèÿ êîíñòàíòíûõ çíà÷åíèé âî âñåõ ñëó÷àÿõ. Ýòî äîâîëüíî íåóäîáíî, òàê êàê ïåðå-

ìåííûå, îïðåäåëåííûå îïåðàòîðîì #

define ÿâëÿþòñÿ ìàêðîêîìàíäàìè è ïîä÷èíÿþòñÿ ñîîòâåòñòâóþùèì

ïðàâèëàì.
Íàïðèìåð îíè íå áóäóò àâòîìàòè÷åñêè ïîäñòàâëÿòüñÿ â ïàðàìåòðàõ äðóãèõ ìàêðîñîâ è ò.ï., íåâîçìîæíî
èõ àâòîìàòè÷åñêîå èñïîëüçîâàíèå â îïåðàòîðàõ

#

è

##

è ò.ï.

Ïî íàøåìó îïûòó áîëåå ïðåäïî÷òèòåëüíûì ñïîñîáîì äëÿ âðåìåííîãî çàïîìèíàíèÿ òàêèõ çíà÷åíèé
ÿâëÿåòñÿ èñïîëüçîâàíèå îïåðàòîðà #

with

âî âñåõ ñëó÷àÿõ, êîãäà ýòî âîçìîæíî:

#with (ARG) (@$upper (arg))
int ARG;
char ARG##_name[] = #ARG;
#end_with
ïîëó÷àÿ â ðåçóëüòàòå:

13

int ARG;
char ARG_name[] = ”ARG”;

with â äàííîé ñèòóàöèè: ïðè èñïîëüdefine äëÿ êîíêàòåíàöèè è âçÿòèÿ â êàâû÷êè ïðèøëîñü áû èñïîëüçîâàòü ñïåöèàëüíûå ìàêðîñû

Îòìåòèì äîïîëíèòåëüíîå äîñòîèíñòâî èñïîëüçîâàíèÿ îïåðàòîðà #
çîâàíèè #

è îïåðàòîð

@:
#define U ARG @$upper (arg)
int U ARG;
char $cat (@U ARG, _name) = $quote (@U ARG);
#undef U ARG

 ýòîì ïðèìåðå ïðåäïîëàãàåòñÿ, ÷òî ìàêðîñû

$cat

è

$quote

îïèñàíû ñëåäóþùèì îáðàçîì:

#define $cat(x, y) x##y
#define $quote(x) #x
Ñëåäóåò òàêæå îòìåòèòü, ÷òî îêàçàëîñü íåîáõîäèìûì ïåðåèìåíîâàòü ïàðàìåòð
ïðîòèâíîì ñëó÷àå ïðè ðàñêðûòèè ñòðî÷êè
ìàêðîñà

ARG

int ARG;

ARG â U ARG, òàê êàê â

âîçíèêëà áû áåñêîíå÷íàÿ ðåêóðñèÿ ïðè ïîäñòàíîâêå

(ýòà îøèáêà îêàçàëàñü íåîæèäàííîé äàæå äëÿ àâòîðà, êîãäà îí ïðîâåðÿë ýòîò ïðèìåð).

Ðàçóìååòñÿ, ýòîò ýôôåêò âîçíèêàåò òîëüêî â òîì ñëó÷àå, åñëè íå çàïðåùåíû ðåêóðñèâíûå ïîäñòàíîâêè
#

define-ìàêðîñîâ

(êëþ÷ - n), íî, òåì íå ìåíåå, ýòî äåìîíñòðèðóåò åùå îäèí ïîòåíöèàëüíûé èñòî÷íèê

define.
èñïîëüçîâàíèå # define

ïðîáëåì, âîçíèêàþùèõ ïðè èñïîëüçîâàíèè #
Äåéñòâèòåëüíî íåîáõîäèìûì

ÿâëÿåòñÿ ïðè íàëè÷èè íàäîáíîñòè îïðåäåëèòü

ãëîáàëüíûå êîíñòàíòû èëè â ñëó÷àÿõ, êîãäà ê ýòîìó çíà÷åíèþ áóäóò ïðèìåíÿòüñÿ îïåðàòîðû #
#

set.

Àâòîðû íå ïðèøëè ê îêîí÷àòåëüíîìó ìíåíèþ ñëåäóåò ëè èñïîëüçîâàòü îïåðàòîð #

with

setm

è

òàêæå è äëÿ

çàêëþ÷åíèÿ â êàâû÷êè êàêîãî-ëèáî òåêñòà. Åäèíñòâåííûì âîçðàæåíèåì ïðîòèâ ýòîãî ÿâëÿåòñÿ íåêîòîðàÿ
ãðîìîçäêîñòü ýòîé êîíñòðóêöèè ïî ñðàâíåíèþ ñ èñïîëüçîâàíèåì ñïåöèàëüíî îïèñàííîé äëÿ ýòîé öåëè
ìàêðîêîìàíäû (íàïîäîáèå

$cat).

14

6.

Ðàáîòà ñ ìàêðîïðîöåññîðîì

6.1.

Çàïóñê ìàêðîïðîöåññîðà

Çàïóñê ìàêðîïðîöåññîðà îñóùåñòâëÿåòñÿ êîìàíäîé

PPC .cpp ...

6.2.

Êëþ÷è ìàêðîïðîöåññîðà

Êëþ÷è äîëæíû ïðåäâàðÿòüñÿ ëèáî ñèìâîëîì

− ëèáî ñèìâîëîì /.  êà÷åñòâå êëþ÷åé ìîãóò èñïîëüçîâàòüñÿ

ñëåäóþùèå ïîñëåäîâàòåëüíîñòè:

• -iP AT H 

ïóòè ïîèñêà ôàéëîâ, âêëþ÷àåìûõ ïðè ïîìîùè #

include

• -l0 

íå âûâîäèòü äèðåêòèâó #

line

• -l1 

âûâîäèòü äèðåêòèâû #

line

ñ ïðèâÿçêîé ê âûçîâó ìàêðî, ïîðîäèâøåé òåêñò

• -l2 

âûâîäèòü äèðåêòèâû #

line

ñ ïðèâÿçêîé ê ñòðîêàì ìàêðî, ïîðîäèâøåé òåêñò

• -n 

çàïðåò íà èñïîëüçîâàíèå ðåêóðñèâíûõ #

• -f 

âûâîäèòü ïðè îøèáêàõ ïîëíóþ òðàññó (âêëþ÷àÿ â íåå âûçîâû hidden ìàêðî)

h
i
• -d = 
• -r 

îïðåäåëèòü èäåíòèôèêàòîð

• -a 



êàê èìåþùèé çíà÷åíèå



çàäàòü êîðíåâîé ôàéë

• -o 
• - ?, - h 

define's

îáðàçåö äëÿ èìåíè âûõîäíîãî ôàéëà (ïî óìîë÷àíèþ  .i)

âûâåñòè êðàòêóþ ñïðàâêó ïî êëþ÷àì

ïðè îòñóòñòâèè ôàéëà, óêàçàííîãî â îïåðàòîðå #

include,

âìåñòî âûäà÷è äèàãíîñòèêè îá îøèáêå

âûâåñòè ýòîò îïåðàòîð â âûõîäíîé ïîòîê

• -m 

êëþ÷, ïðåäíàçíà÷åííûé äëÿ îáðàáîòêè è ãåíåðàöèè machine description file äëÿ êîìïèëÿòîðà GCC.

Ïðè âêëþ÷åíèè ýòîãî ôëàãà ïðåïðîöåññîð íà÷èíàåò îáðàáàòûâàòü êîììåíòàðèè â ñòèëå `.MD' ôàéëà:
ñòðîêè, íà÷èíàþùèåñÿ ñ ` ; ;' èãíîðèðóþòñÿ. Êîììåíòàðèè â ñòèëå

C/C + +

òàêæå îñòàþòñÿ äîïóñòè-

ìûìè.

6.2.1.

Êîðíåâîé ôàéë

Åñëè çàäàí êëþ÷ - r,

òî ìàêðîïðîöåññîð íà÷èíàåò îáðàáàòûâàòü íå òîò ôàéë, êîòîðûé áûë

åìó óêàçàí êàê âõîäíîé ôàéë, à ôàéë, óêàçàííûé â êà÷åñòâå çíà÷åíèÿ êëþ÷à -

r.

Ïðè ýòîì â ñòàíäàðòíóþ

ïåðåìåííóþ __ M AIN F ILE __ çàíîñèòñÿ èìÿ ôàéëà, ïîäëåæàùåãî îáðàáîòêå. Êàê ïðàâèëî â êîðíåâîì
ôàéëå âûïîëíÿþòñÿ íåêîòîðûå îïðåäåëåíèÿ, ïîñëå ÷åãî ñëåäóåò îïåðàòîð

#include

__M AIN F ILE __ ,

ïîñëå êîòîðîãî èíîãäà ñëåäóþò êàêèå-ëèáî ïðîâåðêè êîððåêòíîãî çàâåðøåíèÿ îñíîâíîãî ôàéëà.

6.2.2.

Îáðàçåö äëÿ èìåíè âûõîäíîãî ôàéëà

Çíà÷åíèåì ïàðàìåòðà - o â îáùåì ñëó÷àå ÿâëÿåòñÿ ïðîèçâîëüíàÿ ñïåöèôèêàöèÿ ôàéëà, ÷àñòü ïîëåé êîòîðîé
(ïóòü, èìÿ, òèï) ìîæåò îòñóòñòâîâàòü. Ïðè ðàáîòå îïóùåííûå ÷àñòè çàìåíÿþòñÿ íà ñîîòâåòñòâóþùèå
ìåñòà èç ñïåöèôèêàöèè âõîäíîãî ôàéëà è ïîëó÷åííîå èìÿ èñïîëüçóåòñÿ êàê èìÿ âûõîäíîãî ôàéëà. Êàê
ïðàâèëî çàäàåòñÿ ëèáî òîëüêî òèï ôàéëà (íàïðèìåð óìîë÷àíèå: .i), ëèáî ïîëíàÿ ñïåöèôèêàöèÿ ôàéëà.

15

7.

Íåñîâìåñòèìîñòè è èçâåñòíûå îøèáêè

7.1.

Íåñîâìåñòèìîñòè

Äàííûé ñïèñîê íå ïðåòåíäóåò íà òî, ÷òîáû áûòü èñ÷åðïûâàþùèì îïèñàíèåì íåñîâìåñòèìîñòåé.



Ìàêðîâûçîâû â ïàðàìåòðàõ äðóãèõ ìàêðîâûçîâîâ íå ðàñêðûâàþòñÿ ïåðåä âûçîâîì (íî, åñòåñòâåííî, ðàñêðûâàþòñÿ â òåëå ìàêðîñà ïîñëå åãî ïîäñòàíîâêè, åñëè ýòîìó íå ïðåïÿòñòâóþò êàêèå-ëèáî
ïðè÷èíû (íàïðèìåð âçÿòèå àðãóìåíòà ìàêðîñà â êàâû÷êè)



Ïðè âûáîðêå î÷åðåäíîãî ïàðàìåòðà ìàêðîêîìàíäû ó÷èòûâàþòñÿ âñå ñêîáêè (
êîíñòðóêöèÿ

(a[b, ), c], e)

[], (), {}).

Ïðè ýòîì

ðàññìàòðèâàåòñÿ êàê îäèí ïàðàìåòð (òî åñòü ïåðâàÿ çàêðûâàþùàÿ 

)

èã-

íîðèðóåòñÿ, òàê êàê çàêëþ÷åíà â ñêîáêè äðóãîãî òèïà



Ìàêðîîïåðàòîðû (íà÷èíàþùèåñÿ ñ

#)

ìîãóò íà÷èíàòüñÿ ñ ëþáîé ïîçèöèè ñòðîêè (à íå òîëüêî ñ

íà÷àëà). Ïðè ýòîì îáû÷íî ïðåäøåñòâóþùèé íà÷àëó ìàêðîîïåðàòîðà ñèìâîë ïåðåâîäà ñòðîêè íå
ðàññìàòðèâàåòñÿ êàê ÷àñòü ìàêðîêîìàíäû è íå óäàëÿåòñÿ ïðè çàìåíå íà òåëî ìàêðî.



Îïðåäåëåíèå ìàêðî ïðè ïîìîùè #

define

íå îòìåíÿåò ïðåäûäóùåå îïðåäåëåíèå òîãî æå ìàêðî, à

ïîìåùàåò åãî â ñòåê, ïîñëåäóþùèé îïåðàòîð #

undef âîññòàíàâëèâàåò äåéñòâèå ñòàðîãî îïðåäåëåíèÿ.

Ñòàðîå îïðåäåëåíèå ìîæåò òàêæå ïðîäîëæàòü áûòü äîñòóïíî â ðåçóëüòàòå ïåðåãðóçêè (åñëè åãî
ñïèñîê ïàðàìåòðîâ ìîæåò áûòü îòëè÷åí îò ñïèñêà ïàðàìåòðîâ íîâîãî ìàêðî)



Ïðè çàäàííîì êëþ÷å - n ìàêðîñû, îïðåäåëåííûå ïðè ïîìîùè îïåðàòîðà #

define

íå ìîãóò áûòü

âûçâàíû ðåêóðñèâíî

7.2.
7.2.1.

Îøèáêè, íåäîðàáîòêè è íåîæèäàííûå ýôôåêòû
Ðàçìåð áóôåðà

 íàñòîÿùåå âðåìÿ ìàêðîïðîöåññîð ñîäåðæèò òîëüêî îäíî êîëè÷åñòâåííîå îãðàíè÷åíèå: äëèíà âíóòðåííåãî òåêñòîâîãî áóôåðà (ïðèìåðíî ðàâíàÿ ñóììàðíîé äëèíå òåëà ìàêðîñà è åãî àðãóìåíòîâ) íå ìîæåò
ïðåâûøàòü 8KB äëÿ âåðñèè real-mode MS-DOS è 64KB äëÿ âñåõ ïðî÷èõ âåðñèé. Íà ïðàêòèêå, ïîìåõîé
ÿâëÿåòñÿ òîëüêî ïåðâîå èç äâóõ îãðàíè÷åíèé. 64KB îãðàíè÷åíèå äî ñèõ ïîð ïðåâûøàëîñü òîëüêî â ðåçóëüòàòå îøèáîê (íàèáîëåå òèïè÷íàÿ - íåçàêðûòàÿ ñêîáêà â ñïèñêå ïàðàìåòðîâ, äðóãîé òèïè÷íûé ïðèìåð
- áåñêîíå÷íàÿ ðåêóðñèÿ ïðè ïîäñòàíîâêå ìàêðîñà).

7.2.2.

Äèàãíîñòèêà îøèáîê ïðè ïîäñòàíîâêå ïàðàìåòðîâ

Ïðè ïîäñòàíîâêå ïàðàìåòðà ìàêðîñà â íåì íå ñîäåðæèòñÿ äåòàëüíîå îïèñàíèå åãî ïðèâÿçêè ê èñõîäíîìó òåêñòó, ïîýòîìó ïðè îøèáêå, ïðè÷èíà êîòîðîé íàõîäèòñÿ âíóòðè ïàðàìåòðà, â òðàññå âûçîâîâ áóäåò
óêàçàíî ìåñòî íà÷àëà ïàðàìåòðà.

7.2.3.

Ïðîáëåìà ïðè êîíêàòåíàöèè àðãóìåíòîâ, âëîæåííûõ â ðàçëè÷íûå ìàêðîñû

Ïðè íåîáõîäèìîñòè îñóùåñòâèòü êîíêàòåíàöèþ íåñêîëüêèõ ïàðàìåòðîâ, ïðèíàäëåæàùèõ ðàçíûì ìàêðîêîìàíäàì âîçíèêàåò ïðîáëåìà, ñâÿçàííàÿ ñ òåì, ÷òî ïðè ðàñêðûòèè òåëà âíåøíåãî ìàêðîñà ïðîèçâîäèòñÿ
êîíêàòåíàöèÿ, ðåçóëüòàò êîòîðîé óæå íå ÿâëÿåòñÿ èìåíåì ïàðàìåòðà âëîæåííîãî ìàêðî. Ïðèìåð: â ðåçóëüòàòå îáðàáîòêè

#with (a) (A)
#with (b) (B)
a##b
#end_with
#end_with
ïîñëå ðàñêðûòèÿ âíåøíåãî îïåðàòîðà #

with

áóäåò ïîëó÷åí ñëåäóþùèé òåêñò:

16

#with (b) (B)
Ab
#end_with
À â ðåçóëüòàòå åãî ðàñêðûòèÿ áóäåò ïîëó÷åíî
óäâîåíèå îïåðàòîðà

Ab.

Ïðàâèëüíûì âàðèàíòîì â òàêîé ñèòóàöèè áóäåò

##:
#with (a) (A)
#with (b) (B)
a## ##b
#end_with
#end_with

òîãäà ïîñëå ðàñêðûòèÿ âíåøíåãî îïåðàòîðà #

with

áóäåò ïîëó÷åíî:

#with (b) (B)
A##b
#end_with
è ðåçóëüòàòîì åãî ðàñêðûòèÿ áóäåò

7.2.4.

AB .

Ïåðåâîä ñòðîêè â êîíöå ìàêðîñà

Ðåçóëüòàòîì ðàñêðûòèÿ êîíñòðóêöèè

#macro M
XXX
#endm
áóäåò

XXX\n,

òàê êàê

\n,

ïðåäøåñòâóþùèé îïåðàòîðó #

endm

íå ðàññìàòðèâàåòñÿ êàê åãî ÷àñòü. Â

íåêîòîðûõ ñèòóàöèÿõ ýòî íåæåëàòåëüíî. Â òàêîé ñèòóàöèè ñëåäóåò ïèñàòü #
ñòðîêè òåêñòà:

#macro M
XXX#endm
Èëè, áîëåå óäîáî÷èòàåìàÿ çàïèñü òîãî-æå ñàìîãî:

#macro M
XXX\
#endm

17

endm ñðàçó ïîñëå ïîñëåäíåé