Расширенный макропроцессор для языка C/C++ [Антон Евгеньевич Москаль kouzdra] (pdf) читать онлайн
Книга в формате pdf ! Изображения и текст могут не отображаться!
[Настройки текста] [Cбросить фильтры]
Цвет фона черный светло-черный бежевый бежевый 2 персиковый зеленый серо-зеленый желтый синий серый красный белый
Цвет шрифта белый зеленый желтый синий темно-синий серый светло-серый тёмно-серый красный
Размер шрифта 14px 16px 18px 20px 22px 24px
Шрифт Arial, Helvetica, sans-serif "Arial Black", Gadget, sans-serif "Bookman Old Style", serif "Comic Sans MS", cursive Courier, monospace "Courier New", Courier, monospace Garamond, serif Georgia, serif Impact, Charcoal, sans-serif "Lucida Console", Monaco, monospace "Lucida Sans Unicode", "Lucida Grande", sans-serif "MS Sans Serif", Geneva, sans-serif "MS Serif", "New York", sans-serif "Palatino Linotype", "Book Antiqua", Palatino, serif Symbol, sans-serif Tahoma, Geneva, sans-serif "Times New Roman", Times, serif "Trebuchet MS", Helvetica, sans-serif Verdana, Geneva, sans-serif
Насыщенность шрифта жирный
Обычный стиль курсив Ширина текста 400px 500px 600px 700px 800px 900px 1000px 1100px 1200px Показывать меню Убрать меню Абзац 0px 4px 12px 16px 20px 24px 28px 32px 36px 40px
Межстрочный интервал 18px 20px 22px 24px 26px 28px 30px 32px
Îëüãà Êîíîíîâà, Àíòîí Ìîñêàëü, Îëåã Ïëèññ
Ðàñøèðåííûé ìàêðîïðîöåññîð äëÿ ÿçûêà 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 ñðàçó ïîñëå ïîñëåäíåé