РуЛиб - онлайн библиотека > Москаль Антон (kouzdra) > Базы данных > Расширенный макропроцессор для языка C/C++

Читаем онлайн «Расширенный макропроцессор для языка C/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
èìååò îáû÷íûé ñèíòàêñèñ, çà èñêëþ÷åíèåì òîãî, ÷òî ñïèñîê ôîðìàëüíûõ ïàðàìåòðîâ
ìîæåò èìåòü îáùèé âèä. Ñ òî÷êè çðåíèÿ ñåìàíòèêè ýòîò îïåðàòîð ìîæåò