1 Простейшие функции

advertisement
1
Ïðîñòåéøèå ôóíêöèè
 C++ äëÿ ïîäïðîãðàìì ïðèíÿò òåðìèí ¾ôóíêöèÿ¿, íåçàâèñèìî îò òîãî, âîçâðàùàåò îíà êàêîå-ëèáî çíà÷åíèå èëè
íåò. Ñèíòàêñèñ îïèñàíèÿ ïðîñòåéøåé ôóíêöèè òàêîâ:
òèï_ðåçóëüòàòà èìÿ_ôóíêöèè(ñïèñîê_ïàðàìåòðîâ)
{
òåëî_ôóíêöèè
}
Íàïðèìåð:
int sqr(int x)
{
return x*x;
}
îïðåäåëÿåò ôóíêöèþ, âîçâðàùàþùóþ êâàäðàò ñâîåãî ïàðàìåòðà.
Åñëè ôóíêöèÿ íå äîëæíà âîçâðàùàòü íèêàêîãî çíà÷åíèÿ, â êà÷åñòâå òèïà ðåçóëüòàòà èñïîëüçóåòñÿ êëþ÷åâîå ñëîâî
void. Íàïðèìåð:
void print(int x)
{
cout<<"x="<<x<<endl;
}
Åñëè ó ôóíêöèè íåò ïàðàìåòðîâ, ìîæíî ïðîñòî îñòàâèòü ïóñòûå ñêîáêè (óáðàòü èõ ñîâñåì, êàê â Pascal, íåëüçÿ):
void error()
{
cout<<"File not found."<<endl;
}
Èíîãäà â ñòàðûõ ïðîãðàììàõ ìîæíî âñòðåòèòü è òàêîå:
void error(void)
{
cout<<"File not found."<<endl;
}
Åñëè ó ôóíêöèè íåñêîëüêî ïàðàìåòðîâ, èõ äåêëàðàöèè ðàçäåëÿþòñÿ çàïÿòîé, ïðè÷åì äàæå åñëè äâà ïîäðÿä èäóùèõ
ïàðàìåòðà èìåþò îäèíàêîâûé òèï, ýòîò òèï íóæíî ïèñàòü äâàæäû, ïðè êàæäîì ïàðàìåòðå:
double average(double x, double y)
{
return (x+y)/2;
}
Ñèíòàêñèñ âîçâðàòà ðåçóëüòàòà ôóíêöèè òîæå ñèëüíî îòëè÷àåòñÿ îò ïðèíÿòîãî â Pascal.  C++ äëÿ ýòîãî èñïîëüçóåòñÿ ñïåöèàëüíûé îïåðàòîð return âûðàæåíèå;. Âûïîëíåíèå ýòîãî îïåðàòîðà ïðèâîäèò ê òîìó, ÷òî âûðàæåíèå
âû÷èñëÿåòñÿ, âûïîëíåíèå ôóíêöèè ïðåêðàùàåòñÿ è çíà÷åíèå ýòîãî âûðàæåíèÿ ñòàíîâèòñÿ ðåçóëüòàòîì ôóíêöèè. Åñëè
ôóíêöèÿ ñîãëàñíî ñâîåìó çàãîëîâêó äîëæíà âîçâðàùàòü êàêîé-ëèáî ðåçóëüòàò, íàëè÷èå òàêîãî îïåðàòîðà â åå òåëå
íåáõîäèìî, õîòÿ íå âñå êîìïèëÿòîðû ýòî ïðîâåðÿþò. Åñëè æå ó ôóíêöèè íåò ðåçóëüòàòà, íàëè÷èå òàêîãî îïåðàòîðà
íåîáÿçàòåëüíî, è ôóíêöèÿ çàâåðøàåòñÿ ïîñëå âûïîëíåíèÿ ïîñëåäíåãî îïåðàòîðà èç åå òåëà. Îäíàêî, è â òàêîé ôóíêöèè
äîïóñòèì îïåðàòîð return; áåç âûðàæåíèÿ, ïîçâîëÿþùèé çàâåðøèòü âûïîëíåíèå ôóíêöèè äîñðî÷íî.
Âàæíûì çàìå÷àíèåì î ôóíêöèÿõ â C++ ÿâëÿåòñÿ ñëåäóþùåå: â îòëè÷èå îò Pascal, C++ íå ïîääåðæèâàåò âëîæåííûå ôóíêöèè, ò. å. âû íå èìååòå ïðàâà îïðåäåëÿòü îäíó ôóíêöèþ âíóòðè äðóãîé.
Òàêæå, â C++ åñòü ìåõàíèçì çíà÷åíèé ïî óìîë÷àíèþ äëÿ ïàðàìåòðîâ ôóíêöèé. Ñèíòàêñèñ çíà÷åíèé ïî óìîë÷àíèþ
î÷åíü ïîõîæ íà èíèöèàëèçàöèþ. Åñëè òàêèå çíà÷åíèÿ çàäàíû, ñîîòâåòñòâóþùèå ïàðàìåòðû ïðè âûçîâå ìîæíî íå
óêàçûâàòü, è îíè â ýòîì ñëó÷àå áóäóò èìåòü çàäàííûå ïî óìîë÷àíèþ çíà÷åíèÿ.
Íàïðèìåð, ôóíêöèÿ
void print(double x = 0, double y = 0, double z = 0)
{
cout<<x<<" "<<y<<" "<<z<<endl;
}
ìîæåò áûòü âûçâàíà ÷åòûðüìÿ ñïîñîáàìè: áåç ïàðàìåòðîâ (òîãäà â òåëå ôóíêöèè âñå ôîðìàëüíûå ïàðàìåòðû áóäóò
íóëÿìè), ñ îäíèì ïàðàìåòðîì (òîãäà â òåëå ôóíêöèè x áóäåò èìåòü çíà÷åíèå åäèíñòâåííîãî ïàðàìåòðà, à âñå îñòàëüíûå
ôîðìàëüíûå ïàðàìåòðû áóäóò íóëÿìè), è ò. ä. äî òðåõ ïàðàìåòðîâ (òîãäà x, y, z áóäóò èìåòü óêàçàííûå çíà÷åíèÿ).
Èìåþòñÿ äâà ïðàâèëà çàäàíèÿ çíà÷åíèé ïî óìîë÷àíèþ:
1) åñëè äëÿ íåêîòîðîãî ïàðàìåòðà óêàçàíî çíà÷åíèå ïî óìîë÷àíèþ, òî äëÿ âñåõ ïîñëåäóþùèõ ïàðàìåòðîâ òàêæå
äîëæíû áûòü óêàçàíû çíà÷åíèÿ ïî óìîë÷àíèþ;
2) â êàæäîì èñõîäíîì ôàéëå çíà÷åíèÿ ïî óìîë÷àíèþ äëÿ êîíêðåòíîé ôóíêöèè óêàçûâàþòñÿ òîëüêî îäèí ðàç,
â ïåðâîì çàãîëîâêå ýòîé ôóíêöèè, êîòîðûé âèäèò êîìïèëÿòîð (íå âàæíî, áóäåò ëè ýòîò çàãîëîâîê ïðîòîòèïîì èëè
îïðåäåëåíèåì ýòîé ôóíêöèè).
Íàïèñàòü ôóíêöèþ, ïðèíèìàþùóþ â êà÷åñòâå ïàðàìåòðà ïîëîæèòåëüíîå öåëîå ÷èñëî è âîçâðàùàþùóþ ñóììó åãî
ïðîñòûõ äåëèòåëåé.
Çàäà÷à.
2
Ñòàòè÷åñêèå ïåðåìåííûå
Êàê è â Pascal, ôóíêöèÿ ìîæåò èìåòü ñâîè ëîêàëüíûå ïåðåìåííûå, è òàê æå, êàê è â Pascal, òàêèå ïåðåìåííûå
ñîçäàþòñÿ êàæäûé ðàç ïðè âûçîâå ôóíêöèè è óíè÷òîæàþòñÿ ïðè âûõîäå èç íåå. Îäíàêî, èíîãäà òðåáóåòñÿ, ÷òîáû
ïåðåìåííàÿ ñîõðàíÿëà ñâîå çíà÷åíèå è ïðè âûõîäå èç ôóíêöèè, è ïðè ïîâòîðíîì âûçîâå èìåëà òî çíà÷åíèå, êîòîðîå
áûëî åé ïðèñâîåíî ïðè ïðåäûäóùåì âûçîâå. Äëÿ ýòîãî â Pascal ñëóæàò òàê íàçûâàåìûå êîíñòàíòû ñ óêàçàíèåì òèïà; â
C++ èñïîëüçóåòñÿ ñîâåðøåííî äðóãîé ñèíòàêñèñ, è òóò òàêèå ïåðåìåííûå íàçûâàþòñÿ ñòàòè÷åñêèìè. Äëÿ îáúÿâëåíèÿ
ñòàòè÷åñêîé ïåðåìåííîé â ôóíêöèè íåîáõîäèìî äîáàâèòü â äåêëàðàöèþ êëþ÷åâîå ñëîâî static ïåðåä òèïîì ïåðåìåííûõ;
äåéñòâèå ýòîãî ñëîâà ðàñïðîñòðàíÿåòñÿ íà âñå îáúÿâëÿåìûå â ýòîé äåêëàðàöèè ïåðåìåííûå.
Ñòàòè÷åñêèå ïåðåìåííûå, êàê è ëþáûå äðóãèå, ìîãóò áûòü èíèöèàëèçèðîâàíû ïðè îáúÿâëåíèè. Îäíàêî ýòà èíèöèàëèçàöèÿ â îòëè÷èå îò îáû÷íûõ ïåðåìåííûõ âûïîëíÿåòñÿ çà âñå âðåìÿ ðàáîòû ïðîãðàììû îäèí ðàç, êîãäà âûïîëíåíèå
ïðîãðàììû ïåðâûé ðàç äîõîäèò äî äåêëàðàöèè òàêîé ïåðåìåííîé.
Ïðèìåð (ôóíêöèÿ, âîçâðàùàþùàÿ íîìåð ñâîåãî âûçîâà):
int count()
{
static int n = 0;
return ++n;
}
Çàäà÷à.
Íàïèñàòü ôóíêöèþ ñ îäíèì âåùåñòâåííûì ïàðàìåòðîì x, âîçâðàùàþùóþ ñðåäíåå àðèôìåòè÷åñêîå âñåõ ïåðåäàííûõ
ýòîé ôóíêöèè ïàðàìåòðîâ, âêëþ÷àÿ ïîñëåäíèé, ò. å. ïðè ïåðâîì âûçîâå âîçâðàùàåòñÿ çíà÷åíèå ïàðàìåòðà, ïðè âòîðîì
ñðåäíåå àðèôìåòè÷åñêîå çíà÷åíèÿ ïàðàìåòðà âòîðîãî âûçîâà è çíà÷åíèÿ ïàðàìåòðà ïåðâîãî âûçîâà, è ò. ä. Íàïðèìåð,
åñëè áûëî ñäåëàíî 3 âûçîâà f(3.0), f(5.0), f(13.0), âîçâðàùàåìûå çíà÷åíèÿ áóäóò 3.0, 4.0, 7.0.
3
Ïåðåäà÷à ïàðàìåòðîâ ïî ññûëêå
Êàê è â Pascal, â C++ èìååòñÿ âîçìîæíîñòü ïåðåäàâàòü ïàðàìåòðû â ôóíêöèþ ïî ññûëêå. Ñèíòàêñèñ ýòîãî ñèëüíî
îòëè÷àåòñÿ îò ïðèíÿòîãî â Pascal. Äëÿ ïåðåäà÷è êàêîãî-ëèáî ïàðàìåòðà ïî ññûëêå íóæíî ïåðåä åãî èìåíåì ïîñòàâèòü
ñèìâîë &. Íàïðèìåð, ñëåäóþùàÿ ôóíêöèÿ ìåíÿåò ìåñòàìè çíà÷åíèÿ ñâîèõ àðãóìåíòîâ:
void swap(int &x, int &y)
{
int t;
t = x;
x = y;
y = t;
}
Îäíàêî, â C++ åñòü âîçìîæíîñòü, êîòîðîé íåò â Pascal, à èìåííî âîçâðàò ðåçóëüòàòà ôóíêöèè ïî ññûëêå. Åñëè
ôóíêöèÿ âîçâðàùàåò ñâîé ðåçóëüòàò ïî ññûëêå, åå ðåçóëüòàò ñòàíîâèòñÿ ñèíîíèìîì òîé ïåðåìåííîé, êîòîðàÿ ñòîÿëà â îïåðàòîðå return.  ýòîì ñëó÷àå ìû ìîæåì ðåçóëüòàòó ôóíêöèè ÷òî-òî ïðèñâîèòü, è îíî áóäåò çàïèñàíî â òó
ïåðåìåííóþ, êîòîðàÿ ñòîÿëà â îïåðàòîðå return.
Äëÿ òîãî, ÷òîáû âåðíóòü ðåçóëüòàò ïî ññûëêå, íóæíî ïîñòàâèòü ïåðåä èìåíåì ôóíêöèè âñå òîò æå ñèìâîë &. Îäíàêî
ñ ýòèì íóæíî áûòü îñòîðîæíûì.  ÷àñòíîñòè, íåëüçÿ âîçâðàùàòü èç ôóíêöèè ïî ññûëêå ëîêàëüíûå ïåðåìåííûå,
ïîòîìó ÷òî ïîñëå âûõîäà èç ôóíêöèè òàêàÿ ïåðåìåííàÿ èñ÷åçàåò, è ïîëó÷àåòñÿ òàê íàçûâàåìàÿ âèñÿ÷àÿ ññûëêà ñèíîíèì íåñóùåñòâóþùåé ïåðåìåííîé. Åñëè ìû ÷òî-òî òàêîé ññûëêå ïðèñâîèì, ìû èñïîðòèì ïàìÿòü ïðîãðàììû, è
ëèáî îïåðàöèîííàÿ ñèñòåìà çàâåðøèò àâàðèéíî ïðîãðàììó, ëèáî ïðîãðàììà áóäåò âûäàâàòü íåâåðíûé ðåçóëüòàò, íàéòè
ïðè÷èíó êîòîðîãî áóäåò î÷åíü íåïðîñòî. Òàê ÷òî ïî ññûëêå ìîæíî âîçâðàùàòü èç ôóíêöèè òîëüêî ñòàòè÷åñêèå (ñì.
ïðåäûäóùèé ðàçäåë) èëè ãëîáàëüíûå ïåðåìåííûå.
 êà÷åñòâå ïðèìåðà ðàññìîòðèì ôðàãìåíò ïðîãðàììû, â êîòîðîì îïðåäåëÿþòñÿ òðè ãëîáàëüíûå ïåðåìåííûå è îäíà
ôóíêöèÿ, îáåñïå÷èâàþùàÿ äîñòóï ê îäíîé èç ïåðåìåííûõ ïî íîìåðó (íîìåð ïåðåäàåòñÿ â êà÷åñòâå ïàðàìåòðà).
int x1, x2, x3;
int &x(int n)
{
static int y;
switch(n)
{
case 1: return x1;
case 2: return x2;
case 3: return x3;
default: return y;
}
}
Ïîñëå ýòîãî ìû ìîæåì ïîëó÷èòü çíà÷åíèå x1, íàïèñàâ x(1); áîëåå òîãî, ìû ìîæåì ïðèñâîèòü ïåðåìåííîé x2 çíà÷åíèå
7, íàïèñàâ x(2)=7; è äàæå áîëåå òîãî, ìû ìîæåì ïðèñâîèòü çíà÷åíèå, ñêàæåì, 3 òîé ïåðåìåííîé, íîìåð êîòîðîé
ñîäåðæèòñÿ â äðóãîé ïåðåìåííîé, íàïðèìåð, i, òàê: x(i)=3;.
Íàïèñàòü ôóíêöèþ áåç ïàðàìåòðîâ, èìåþùóþ 3 ñòàòè÷åñêèå öåëûå ïåðåìåííûå è ïðåäîñòàâëÿþùóþ äîñòóï ê òîé
èç íèõ, êîòîðàÿ èìååò íàèìåíüøåå çíà÷åíèå, ò. å. âûðàæåíèå âèäà cout¾f(); äîëæíî ïå÷àòàòü íàèìåíüøåå çíà÷åíèå èç
ýòèõ òðåõ ïåðåìåííûõ, è âûðàæåíèå f()=... äîëæíî çàïèñûâàòü çíà÷åíèå âûðàæåíèÿ ñïðàâà îò = â òó èç ñòàòè÷åñêèõ
ïåðåìåííûõ, çíà÷åíèå êîòîðîé íàèìåíüøåå (åñëè òàêèõ íåñêîëüêî, ãîäèòñÿ ëþáàÿ èç íèõ; ïîñëå òàêîãî ïðèñâàèâàíèÿ,
âîîáùå ãîâîðÿ, çíà÷åíèå ýòîé ïåðåìåííîé ìîæåò è ïåðåñòàòü áûòü íàèìåíüøèì).
Çàäà÷à.
4
Ðåêóðñèÿ
Êàê è Pascal, ÿçûê C++ ïîääåðæèâàåò ðåêóðñèþ, êàê îáû÷íóþ, òàê è ìíîæåñòâåííóþ. Íàïîìíèì òîëüêî, ÷òî ïðè
èñïîëüçîâàíèè ðåêóðñèè íàäî áûòü îñòîðîæíûì ñî ñòàòè÷åñêèìè ïåðåìåííûìè, ïîñêîëüêó ó êàæäîãî âûçîâà ôóíêöèè
ñâîÿ êîïèÿ êàæäîé îáû÷íîé ëîêàëüíîé ïåðåìåííîé, íî ñòàòè÷åñêàÿ ïåðåìåííàÿ îäíà äëÿ âñåõ âûçîâîâ òîé ôóíêöèè, â
êîòîðîé îíà îïðåäåëÿåòñÿ, è ïîòîìó âñå èçìåíåíèÿ ñòàòè÷åñêîé ïåðåìåííîé â îäíîì âûçîâå âèäíû âî âñåõ îñòàëüíûõ
âûçîâàõ òîé æå ôóíêöèè.
Çäåñü æå óìåñòíî îáñóäèòü âîïðîñ î òîì, êàê îðãàíèçîâàòü ìíîæåñòâåííóþ ðåêóðñèþ. Äåëî â òîì, ÷òî âñå èñïîëüçóåìûå ôóíêöèè äîëæíû áûòü îáúÿâëåíû, íî åñëè åñòü äâå ôóíêöèè, êàæäàÿ èç êîòîðûõ âûçûâàåò äðóãóþ, òî
íåïîíÿòíî, êàêóþ èç íèõ îïèñûâàòü ïåðâîé.
 Pascal ýòà ïðîáëåìà ðåøàëàñü ïðè ïîìîùè òàê íàçûâàåìûõ forward-äåêëàðàöèé, êîãäà ñíà÷àëà ñòîÿë çàãîëîâîê
ïåðâîé ôóíêöèè, çà íèì êëþ÷åâîå ñëîâî forward, è çàòåì îïðåäåëåíèå âòîðîé è ïîòîì ïåðâîé ôóíêöèé.  Ñ++
ïîäîáíûé ìåõàíèçì òîæå ñóùåñòâóåò è íàçûâàåòñÿ ïðîòîòèïîì ôóíêöèè.
Îêàçûâàåòñÿ, â C++ âû ìîæåòå îáúÿâèòü èëè îïðåäåëèòü ôóíêöèþ, è ìåæäó ýòèìè ïîíÿòèÿìè èìååòñÿ áîëüøàÿ
ðàçíèöà. Äî ñèõ ïîð ìû ñòàëêèâàëèñü òîëüêî ñ îïðåäåëåíèÿìè ôóíêöèé. Îáúÿâëåíèå ôóíêöèè, èëè ïðîòîòèï, îòëè÷àåòñÿ îò îïðåäåëåíèÿ òåì, ÷òî âìåñòî òåëà ôóíêöèè ñòîèò òî÷êà ñ çàïÿòîé. Ïðîòîòèï ýòî àíàëîã forward-äåêëàðàöèè
â Pascal.
Êàê è â Pascal, äëÿ ïðàâèëüíîé êîìïèëÿöèè âûçîâà ôóíêöèè íå íóæíî çíàòü åå òåëî, äîñòàòî÷íî èìåòü ïðîòîòèï.
Áîëåå òîãî, â C++ â ïðîòîòèïå äàæå íåò íåîáõîäèìîñòè ïèñàòü èìåíà ïàðàìåòðîâ äîñòàòî÷íî òîëüêî óêàçàòü èõ
òèïû.
 êà÷åñòâå ïðèìåðà ðàññìîòðèì äâå ôóíêöèè ñ öåëûì ïàðàìåòðîì è öåëûì ðåçóëüòàòîì, âû÷èñëÿþùèå ïîñëåäîâàòåëüíîñòè an è bn , çàäàííûå ñîîòíîøåíèÿìè a1 = 1, b1 = 2, an = an−1 + 2bn−1 , bn = 3an−1 − bn−1 ïðè n > 1.
int a(int);
int b(int n)
{
if(n==1)
return
else
return
}
int a(int n)
{
if(n==1)
return
else
return
}
Çàäà÷à.
2;
3*a(n-1)-b(n-1);
1;
a(n-1)+2*b(n-1);
Íàïèñàòü ôóíêöèþ, âîçâðàùàþùóþ ÷èñëî âñåõ âîçìîæíûõ ïðåäñòàâëåíèé ñâîåãî ïàðàìåòðà â âèäå ñóììû ïîëîæèòåëüíûõ öåëûõ ÷èñåë (ïðè ýòîì ïîðÿäîê ñëàãàåìûõ íåñóùåñòâåí, ò. å. 2+1 è 1+2 ñ÷èòàþòñÿ îäèíàêîâûìè). Ïîäñêàçêà:
íóæíî ïèñàòü ôóíêöèþ ñ äâóìÿ ïàðàìåòðàìè, è äëÿ äîïîëíèòåëüíîãî ïàðàìåòðà èñïîëüçîâàòü çíà÷åíèå ïî óìîë÷àíèþ.
5
Ïåðåãðóçêà ôóíêöèé
ßçûê C++ ïîääåðæèâàåò, â îòëè÷èå îò Pascal, ïåðåãðóçêó ôóíêöèé. Ýòî îçíà÷àåò, ÷òî ìîæíî èìåòü íåñêîëüêî ðàçíûõ
ôóíêöèé ñ îäèíàêîâûìè èìåíàìè. Åäèíñòâåííîå îãðàíè÷åíèå ñîñòîèò â òîì, ÷òî ýòè ôóíêöèè äîëæíû îòëè÷àòüñÿ
íàáîðàìè òèïîâ ïàðàìåòðîâ. Îòëè÷èÿ â òèïàõ âîçâðàùàåìîãî çíà÷åíèÿ èëè â èìåíàõ ïàðàìåòðîâ íåäîñòàòî÷íî. Ïðè
ýòîì, åñòåñòâåííî, ïîðÿäîê ïàðàìåòðîâ ñóùåñòâåíåí, ò. å. ñëåäóþùàÿ ïåðåãðóçêà âïîëíå äîïóñòèìà (óêàçàíû òîëüêî
ïðîòîòèïû ôóíêöèé):
int a(int, double);
int a(double, int);
Ïåðåãðóçêà ôóíêöèé ìîæåò êîíôëèêòîâàòü ñ çàäàíèåì çíà÷åíèé ïî óìîë÷àíèþ äëÿ íåêîòîðûõ ïàðàìåòðîâ. Íàïðèìåð, åñëè åñòü äâå ôóíêöèè
int a(int, int = 0);
int a(int);
òî ñîâåðøåííî íåïîíÿòíî, êàêóþ èç íèõ íóæíî âûçûâàòü â âûðàæåíèè a(7).
Ïåðåãðóçèòü ôóíêöèþ area, âû÷èñëÿþùóþ ïîëíóþ ïëîùàäü ïîâåðõíîñòè êóáà ïî ðåáðó, ïðàâèëüíîé ÷åòûðåõóãîëüíîé ïðèçìû ïî ñòîðîíå îñíîâàíèÿ è âûñîòå, ïðÿìîóãîëüíîãî ïàðàëëåëåïèïåäà ïî òðåì ðåáðàì.
Çàäà÷à.
6
Ôóíêöèè, ÷èñëî è òèï ïàðàìåòðîâ êîòîðûõ çàðàíåå íåèçâåñòíû
Îêàçûâàåòñÿ, C++ (è ýòî äîñòàëîñü åìó â íàñëåäñòâî îò C) ïîääåðæèâàåò äàæå òàêóþ ýêçîòèêó. Ïîëüçîâàòüñÿ ýòîé
âîçìîæíîñòüþ íóæíî êàê ìîæíî ðåæå, ïîñêîëüêó â ýòîì ñëó÷àå ïðîâåðêè òèïîâ íà ýòàïå êîìïèëÿöèè íåâîçìîæíû, è
ïåðåäà÷à íåïðàâèëüíûõ ïàðàìåòðîâ ìîæåò áûòü èñòî÷íèêîì âåñüìà íåòðèâèàëüíûõ îøèáîê.
Îáúÿâëÿåòñÿ òàêàÿ ôóíêöèÿ òàê:
òèï_ðåçóëüòàòà èìÿ_ôóíêöèè(ñïèñîê_ïàðàìåòðîâ,...);
Ïðè ýòîì ñíà÷àëà èäåò íåêîòîðîå êîëè÷åñòâî ÿâíî óêàçàííûõ ïàðàìåòðîâ, òèïû êîòîðûõ èçâåñòíû çàðàíåå (íå ìåíüøå
îäíîãî òàêîãî ïàðàìåòðà, èõ ìû áóäåì íàçûâàòü îñíîâíûìè), à äàëüøå â âûçîâå ìîãóò èñïîëüçîâàòüñÿ ïàðàìåòðû
ëþáûõ òèïîâ â ëþáîì êîëè÷åñòâå (ìû áóäåì íàçûâàòü òàêèå ïàðàìåòðû äîïîëíèòåëüíûìè).
Äëÿ íàïèñàíèÿ òåëà òàêîé ôóíêöèè íóæíî ñíà÷àëà ïîäêëþ÷èòü ñîîòâåòñòâóþùèé çàãîëîâî÷íûé ôàéë:
#include <cstdarg>
 ñàìîì òåëå ôóíêöèè ñíà÷àëà íóæíî îáúÿâèòü ïåðåìåííóþ òèïà va_list:
va_list l;
Èìÿ ïåðåìåííîé ìîæåò áûòü ëþáûì. Çàòåì, ïåðåä íà÷àëîì èçâëå÷åíèÿ äîïîëíèòåëüíûõ ïàðàìåòðîâ, íóæíî íàïèñàòü
ñëåäóþùèé îïåðàòîð:
va_start(l, x);
Çäåñü âìåñòî l äîëæíî ñòîÿòü èìÿ ïåðåìåííîé òèïà va_list (åñëè îíî ó âàñ îòëè÷àåòñÿ), à âìåñòî x èìÿ ïîñëåäíåãî
îñíîâíîãî ïàðàìåòðà. Ïîñëå ýòîãî ìîæíî íà÷àòü èçâëåêàòü äîïîëíèòåëüíûå ïàðàìåòðû. Î÷åðåäíîé äîïîëíèòåëüíûé
ïàðàìåòð èçâëåêàåòñÿ âûçîâîì
va_arg(l, òèï);
Çäåñü òèï òèï òîãî ïàðàìåòðà, êîòîðûé âû ñîáèðàåòåñü èçâëå÷ü (íóæíî åãî çíàòü; îáû÷íî ýòîò òèï îïðåäåëÿåòñÿ
òèïàìè è çíà÷åíèÿìè îñíîâíûõ è óæå èçâëå÷åííûõ ê ýòîìó ìîìåíòó äîïîëíèòåëüíûõ ïàðàìåòðîâ). Íàäî çàìåòèòü,
÷òî êîíñòðóêöèÿ
va_arg(l, double)*va_arg(l, double)
íå âåðíåò âàì êâàäðàò î÷åðåäíîãî ïàðàìåòðà òèïà double, à, ñêîðåå, âåðíåò ïðîèçâåäåíèå äâóõ î÷åðåäíûõ ïàðàìåòðîâ
òèïà double (åñëè âîîáùå áóäåò ðàáîòàòü, ïîñêîëüêó ñòàíäàðò çàïðåùàåò ìåíÿòü îäíó è òó æå ïåðåìåííóþ â îäíîì
âûðàæåíèè äâàæäû, à ñ÷èòûâàíèå ïàðàìåòðîâ îïðåäåëåííî ìåíÿåò íåêîòîðûå âíóòðåííèå ïåðåìåííûå). Âìåñòî ýòîãî, åñëè íóæíî èñïîëüçîâàòü îäèí è òîò æå ñ÷èòàííûé ïàðàìåòð íåñêîëüêî ðàç, åãî íóæíî ñîõðàíèòü â ëîêàëüíîé
ïåðåìåííîé.
Íàêîíåö, êîãäà âñå äîïîëíèòåëüíûå ïàðàìåòðû ñ÷èòàíû, ïåðåä âûõîäîì èç ôóíêöèè (î÷åâèäíî, äî îïåðàòîðà
return!) íóæíî âûçâàòü
va_end(l);
Áåç ýòîãî ïðîãðàììà, ñêîðåå âñåãî, íå áóäåò ðàáîòàòü, ïîñêîëüêó òà ïàìÿòü, ÷åðåç êîòîðóþ ïåðåäàþòñÿ ïàðàìåòðû,
áóäåò ñèëüíî çàïîð÷åíà.
Ïðèìåð.  êà÷åñòâå ïðèìåðà íàïèøåì ôóíêöèþ, ïðèíèìàþùóþ öåëîå ÷èñëî n (îñíîâíîé ïàðàìåòð) è ñòîëüêî äîïîëíèòåëüíûõ âåùåñòâåííûõ ïàðàìåòðîâ, ÷åìó ðàâíî n, è âû÷èñëÿþùóþ ñðåäíåå àðèôìåòè÷åñêîå ñâîèõ âåùåñòâåííûõ
ïàðàìåòðîâ.
double average(int n, ...)
{
va_list l;
double sum = 0;
va_start(l, n);
for(int i = 0; i<n; i++)
sum += va_arg(l, double);
va_end(l);
return sum/n;
}
Çàäà÷à.
Íàïèñàòü ôóíêöèþ, ïðèíèìàþùóþ â êà÷åñòâå ïàðàìåòðîâ íåñêîëüêî âåùåñòâåííûõ ÷èñåë (ïðèçíàêîì êîíöà ÿâëÿåòñÿ íóëåâîå çíà÷åíèå) è âû÷èñëÿþùóþ ñðåäíåå àðèôìåòè÷åñêîå ñâîèõ ïàðàìåòðîâ.
7
Øàáëîíû ôóíêöèé
Âàæíûì ñðåäñòâîì ñîêðàùåíèÿ äëèíû ïðîãðàìì íà C++ ÿâëÿþòñÿ òàê íàçûâàåìûå øàáëîíû. Óâû, â Pascal èõ íåò.
Ðàññìîòðèì äâå ôóíêöèè íà C++, âû÷èñëÿþùèå ìèíèìàëüíîå ÷èñëî èç äâóõ ïàðàìåòðîâ. Îäíà ôóíêöèÿ ðåøàåò
ýòó çàäà÷ó äëÿ öåëûõ ÷èñåë, äðóãàÿ äëÿ âåùåñòâåííûõ. Âñïîìíèì, ÷òî ìû èìååì ïðàâî ïåðåãðóæàòü ôóíêöèè, è
ïîýòîìó ìîæåì íàçâàòü êàæäóþ èç íèõ min.
int min(int x, int y)
{
return x<y? x : y;
}
double min(double x, double y)
{
return x<y? x : y;
}
Ãëÿäÿ íà ýòè ôóíêöèè, ìû ìîæåì çàìåòèòü, ÷òî èõ òåêñòû îòëè÷àþòñÿ òîëüêî òèïàìè ïàðàìåòðîâ è ðåçóëüòàòà.
Âî âñåì îñòàëüíîì òåêñòû ýòèõ ôóíêöèé ñîâïàäàþò. Øàáëîíû ôóíêöèé êàê ðàç è ÿâëÿþòñÿ ñðåäñòâîì ñîêðàùåíèÿ
òåêñòîâ ïðîãðàìì çà ñ÷åò óñòðàíåíèÿ ïîäîáíûõ ïîâòîðåíèé.
Ìû ìîæåì âìåñòî ýòèõ äâóõ ôóíêöèé íàïèñàòü îäèí øàáëîí, èç êîòîðîãî îáå ýòè ôóíêöèè ïîëó÷àþòñÿ ïîäñòàíîâêîé ïðàâèëüíûõ òèïîâ â êà÷åñòâå òàê íàçûâàåìûõ øàáëîííûõ ïàðàìåòðîâ.  äàííîì êîíêðåòíîì ñëó÷àå øàáëîí
áóäåò âûãëÿäåòü òàê:
template<class T>
T min(T x, T y)
{
return x<y? x : y;
}
Ëåãêî âèäåòü, ÷òî èç ýòîãî øàáëîíà ìîæíî ïîëó÷èòü ïåðâóþ ôóíêöèþ ïðè T=int è âòîðóþ ïðè T=double. È åñëè
â íàøåé ïðîãðàììå ïîñëå îïðåäåëåíèÿ òàêîãî øàáëîíà âñòðåòèòñÿ âûçîâ min(3,7) (âìåñòî 3 è 7 ìîãóò áûòü ëþáûå
âûðàæåíèÿ ñ öåëûì ðåçóëüòàòîì), òî êîìïèëÿòîð äîãàäàåòñÿ, ÷òî íóæíî èñïîëüçîâàòü ýòîò øàáëîí è äàæå äîãàäàåòñÿ,
÷òî íóæíî âçÿòü T=int.
Àíàëîãè÷íî, åñëè â ïðîãðàììå âñòðåòèòñÿ âûçîâ min(1.03,2.0), òî áóäåò âçÿò òîò æå øàáëîí, íî óæå ñ T=double.
Îäíàêî, åñëè âñòðåòèòñÿ âûçîâ min(1,2.0), òî êîìïèëÿòîð áóäåò â çàòðóäíåíèè, ïîñêîëüêó ïî ïðàâèëàì èñïîëüçîâàíèÿ øàáëîíîâ ïðè àâòîìàòè÷åñêîì ïîèñêå çíà÷åíèé øàáëîííûõ ïàðàìåòðîâ âûçîâ äîëæåí òî÷íî ñîîòâåòñòâîâàòü
çàãîëîâêó øàáëîííîé ôóíêöèè è ïðåîáðàçîâàíèÿ òèïîâ àðãóìåíòîâ íå äîïóñêàþòñÿ.
Îäíàêî, è â ýòîì ñëó÷àå ìîæíî èçâëå÷ü íåêîòîðóþ ïîëüçó èç íàøåãî øàáëîíà. ßçûê C++ äîïóñêàåò â òàêèõ
ñîìíèòåëüíûõ ñëó÷àÿõ ñàìîìó ïðîãðàììèñòó óêàçûâàòü çíà÷åíèÿ øàáëîííûõ ïàðàìåòðîâ.  íàøåì ñëó÷àå ïðèäåòñÿ
íàïèñàòü min<double>(1,2.0), è ýòî ðàáîòàåò, ïîñêîëüêó min<double> ñ÷èòàåòñÿ îáû÷íîé ôóíêöèåé, è ïðè åå âûçîâå
ïðåîáðàçîâàíèÿ òèïîâ ïàðàìåòðîâ ïðîèñõîäÿò ïî îáû÷íûì ïðàâèëàì.
 ðàññìîòðåííîì ïðèìåðå ïî êðàéíåé ìåðå èíîãäà êîìïèëÿòîð ìîã ñàì óãàäàòü çíà÷åíèÿ øàáëîííûõ ïàðàìåòðîâ.
 äðóãèõ ñëó÷àÿõ ìîãóò áûòü øàáëîííûå ïàðàìåòðû, çíà÷åíèÿ êîòîðûõ íåëüçÿ óãàäàòü â ïðèíöèïå, ãëÿäÿ òîëüêî íà
âûçîâ ôóíêöèè. È â ýòîì òîæå íåò íè÷åãî ïðîòèâîçàêîííîãî, ïðîñòî çíà÷åíèÿ òàêèõ ïàðàìåòðîâ âñåãäà äîëæíû áûòü
óêàçàíû ÿâíî.
 øàáëîíàõ ôóíêöèé ìîæåò áûòü è áîëüøå îäíîãî øàáëîííîãî ïàðàìåòðà.  ýòîì ñëó÷àå â øàáëîííîì çàãîëîâêå
óêàçûâàþòñÿ âñå øàáëîííûå ïàðàìåòðû ÷åðåç çàïÿòóþ.
Äëÿ àâòîìàòè÷åñêîãî óãàäûâàíèÿ çíà÷åíèÿ øàáëîííîãî ïàðàìåòðà âîâñå íåîáÿçàòåëüíî, ÷òîáû ýòîò ïàðàìåòð áûë
â òî÷íîñòè òèïîì îäíîãî èç ôîðìàëüíûõ ïàðàìåòðîâ. Íàïðèìåð, òèï îäíîãî èç ôîðìàëüíûõ ïàðàìåòðîâ ìîæåò áûòü
ïîñòðîåí èç øàáëîííîãî ïàðàìåòðà ñ èñïîëüçîâàíèåì ñòàíäàðòíûõ ñðåäñòâ äëÿ ïîñòðîåíèÿ íîâûõ òèïîâ. Â ñëåäóþùåì
ïðèìåðå ôîðìàëüíûå ïàðàìåòðû èìåþò òèï ññûëêè íà øàáëîííûå ïàðàìåòðû:
template<class T>
void swap(T &x, T &y)
{
T tmp;
tmp = x;
x = y;
y = tmp;
}
Ïîñëåäíèé ïðèìåð òàêæå ïîêàçûâàåò, ÷òî â òåëå øàáëîíà ôóíêöèè ìû âïîëíå ìîæåì èñïîëüçîâàòü çíà÷åíèÿ
øàáëîííûõ ïàðàìåòðîâ äëÿ îïðåäåëåíèÿ ïåðåìåííûõ; áîëåå òîãî, ìû ìîæåì ñòðîèòü èç øàáëîííûõ ïàðàìåòðîâ íîâûå
òèïû ïðè ïîìîùè ñòàíäàðòíûõ ñðåäñòâ è ïîëó÷åííûå òèïû èñïîëüçîâàòü äëÿ îïðåäåëåíèÿ ïåðåìåííûõ.
Íàïèñàòü øàáëîííóþ ôóíêöèþ, óïîðÿäî÷èâàþùóþ çíà÷åíèÿ ñâîèõ òðåõ ïàðàìåòðîâ (ïðîèçâîëüíîãî, íî îäèíàêîâîãî äëÿ âñåõ òðåõ ïàðàìåòðîâ òèïà) ïî âîçðàñòàíèþ.
Çàäà÷à.
8
Ðàçäåëüíàÿ êîìïèëÿöèÿ
Âàæíîé âîçìîæíîñòüþ ÿçûêà C++ (îòêóäà, íàâåðíîå, îíà áûëà ïîçàèìñòâîâàíà è â Pascal) ÿâëÿåòñÿ ðàçäåëíàÿ êîìïèëÿöèÿ. Îðãàíèçàöèÿ ðàçäåëüíîé êîìïèëÿöèè â C++ ïðîùå, ÷åì â Pascal.
 îòëè÷èå îò Pascal, â C++ íåò îòäåëüíûõ ïîíÿòèé ïðîãðàììû è ïîäêëþ÷àåìûõ ê íåé îñîáûì îáðàçîì ìîäóëåé.
Ïðîñòî îïðåäåëåíèÿ âñåõ íåøàáëîííûõ ôóíêöèé ïðîãðàììû, à òàêæå âñåõ ãëîáàëüíûõ ïåðåìåííûõ ìîãóò áûòü ðàñïðåäåëåíû ïî íåñêîëüêèì ôàéëàì. Êðîìå òîãî, ïðîãðàììà ìîæåò èñïîëüçîâàòü, íî íå îïðåäåëÿòü íåêîòîðûå ôóíêöèè,
íàïðèìåð ôóíêöèè ââîäà-âûâîäà èëè äðóãèå ñòàíäàðòíûå ôóíêöèè ÿçûêà C++.
Èñïîëüçîâàíèå ðàçäåëüíîé êîìïèëÿöèè ïðèâîäèò ê òîìó, ÷òî ïðîöåññ ïîëó÷åíèÿ ïðîãðàììû íà ìàøèííîì ÿçûêå
(â Windows ýòî ôàéë .exe) èç íàáîðà èñõîäíûõ ôàéëîâ ïðîãðàììû íà C++ ñòàíîâèòñÿ äâóõýòàïíûì.
Ïåðâûé ýòàï ñîáñòâåííî êîìïèëÿöèÿ. Îòäåëüíûå èñõîäíûå ôàéëû çàòåì ìîãóò áûòü ñêîìïèëèðîâàíû ñîâåðøåííî
íåçàâèñèìî äðóã îò äðóãà. Ðåçóëüòàò êîìïèëÿöèè îäíîãî èñõîäíîãî ôàéëà íàçûâàåòñÿ îáúåêòíûì ìîäóëåì; â Windows
ýòî ôàéë ñ ðàñøèðåíèåì ¾.obj¿.
Âòîðîé ýòàï íàçûâàåòñÿ êîìïîíîâêîé (ïî-àíãëèéñêè linking). Îí ñîñòîèò â ñáîðêå âñåõ îáúåêòíûõ ìîäóëåé â ãîòîâóþ
ïðîãðàììó íà ìàøèííîì ÿçûêå. Êðîìå îáúåêòíûõ ìîäóëåé, ïîëó÷åííûõ èç èñõîäíûõ ôàéëîâ ïðîãðàììû ïîëüçîâàòåëÿ,
íà ýòîì ýòàïå òðåáóþòñÿ äîïîëíèòåëüíî ôàéëû, íàçûâàåìûå áèáëèîòåêàìè, ñîäåðæàùèå ìàøèííûé êîä ñòàíäàðòíûõ
ôóíêöèé, êîòîðûå íå îïðåäåëÿþòñÿ â ïðîãðàììå ïîëüçîâàòåëÿ, íî èñïîëüçóþòñÿ â íåé, íàïðèìåð, ôóíêöèé ââîäàâûâîäà. Áèáëèîòåêè îáû÷íî ïðåäñòàâëÿþò ñîáîé íàáîðû îáúåêòíûõ ìîäóëåé, îáúåäèíåííûõ â îäèí ôàéë (ïîä Windows
îíè îáû÷íî èìåþò ðàñøèðåíèÿ .lib è .dll).
Ðàçäåëüíàÿ êîìïèëÿöèÿ óäîáíà ïðè íåáîëüøèõ ìîäèôèêàöèÿõ áîëüøèõ ïðîãðàìì, êîãäà èìååòñÿ ìíîãî îòäåëüíûõ
ôàéëîâ, è èç íèõ èçìåíÿåòñÿ ëèøü íåáîëüøîå êîëè÷åñòâî. Òîãäà íåò íåîáõîäèìîñòè ïåðåêîìïèëèðîâàòü âñå ôàéëû,
à ìîæíî ïåðåêîìïèëèðîâàòü òîëüêî òå ôàéëû, êîòîðûå áûëè èçìåíåíû. Ïðàâäà, ïåðåêîìïîíîâûâàòü ïðèäåòñÿ âñå.
Ñìûñë îáúåäèíåíèÿ ôàéëîâ ïðîãðàììû â ïðîåêòû, íàïðèìåð, â Visual Studio, â òîì è ñîñòîèò, ÷òîáû ïåðåêîìïèëèðîâàòü òîëüêî èçìåíèâøèåñÿ ôàéëû.
Õîòÿ íåøàáëîííûå ôóíêöèè è ìîãóò áûòü ðàñïðåäåëåíû ïî ðàçíûì ôàéëàì, äëÿ ïðàâèëüíîé êîìïèëÿöèè âûçîâîâ
èñïîëüçóåìûõ ôóíêöèé êîìïèëÿòîð äîëæåí âèäåòü èõ ïðîòîòèïû. Îáû÷íî âñå ôóíêöèè ïðîãðàììû äåëÿòñÿ íà ãðóïïû
ïî ñìûñëó è ïðîòîòèïû ôóíêöèé èç êàæäîé ãðóïïû çàïèñûâàþòñÿ â îòäåëüíûå ôàéëû, íàçûâàþùèåñÿ çàãîëîâî÷ûìè
(ïîòîìó, ÷òî îíè ñîäåðæàò çàãîëîâêè ôóíêöèé). Ýòè ôàéëû çàòåì ìîãóò áûòü âêëþ÷åíû â òå èñõîäíûå ôàéëû íà
C++, êîòîðûå ïîëüçóþòñÿ ôóíêöèÿìè äàííîé ãðóïïû, ïðè ïîìîùè äèðåêòèâû ïðåïðîöåññîðà #include.
Ñ øàáëîíàìè ôóíêöèé äåëî îáñòîèò íåñêîëüêî èíà÷å. Äëÿ ïðàâèëüíîé êîìïèëÿöèè ôàéëà, â êîòîðîì èñïîëüçóåòñÿ
äàííûé øàáëîí, êîìïèëÿòîðó íåîáõîäèìî âèäåòü îïðåäåëåíèå øàáëîííîé ôóíêöèè, à íå òîëüêî ïðîòîòèï. Ïîýòîìó
øàáëîíû ôóíêöèé îáû÷íî òàêæå, êàê è ïðîòîòèïû, ïîìåùàþòñÿ â çàãîëîâî÷íûå ôàéëû.
À âîò ïîìåùàòü îïðåäåëåíèÿ íåøàáëîííûõ ôóíêöèé â çàãîëîâî÷íûå ôàéëû íå ñòîèò, ïîñêîëüêó òîãäà îïðåäåëåíèå
òàêîé ôóíêöèè áóäåò âñòðå÷àòüñÿ â íåñêîëüêèõ èñõîäíûõ ôàéëàõ, è ñëåäîâàòåëüíî, ðåàëèçàöèÿ ýòîé ôóíêöèè áóäåò
ïðèñóòñòâîâàòü â íåñêîëüêèõ îáúåêòíûõ ìîäóëÿõ, ÷òî ïðèâåäåò ê îøèáêàì êîìïîíîâêè.
Äëÿ èñïîëüçîâàíèÿ â îäíîì ôàéëå ãëîáàëüíûõ ïåðåìåííûõ, îïðåäåëåííûõ â äðóãîì ôàéëå, â òîì ôàéëå, ãäå ïåðåìåííûå èñïîëüçóþòñÿ, äîëæíî áûòü èõ îáúÿâëåíèå, îòëè÷àþùååñÿ êëþ÷åâûì ñëîâîì extern ïåðåä òèïîì. Íàïðèìåð,
ñëåäóþùàÿ äåêëàðàöèÿ
extern int x;
ãîâîðèò êîìïèëÿòîðó, ÷òî ãäå-òî â äðóãîì (èëè äàæå â òîì æå, íî â äðóãîì ìåñòå) ôàéëå îïðåäåëåíà ïåðåìåííàÿ x
òèïà öåëîå ÷èñëî, êîòîðóþ ìû ñîáèðàåìñÿ èñïîëüçîâàòü.
Ïîñëåäíèå ïîíÿòèÿ, î êîòîðûõ õîòåëîñü áû çäåñü óïîìÿíóòü, âíåøíåå è âíóòðåííåå ñâÿçûâàíèå. Âíåøíåå ñâÿçûâàíèå äëÿ ãëîáàëüíîé ïåðåìåííîé èëè ôóíêöèè îçíà÷àåò, ÷òî îíè áóäóò âèäíû âî âñåõ ôàéëàõ ïðîãðàììû (ïðè
óñëîâèè, åñòåñòâåííî, íàëè÷èÿ â òîì ôàéëå, ãäå ìû õîòèì èõ èñïîëüçîâàòü, ñîîòâåòñòâóþùèõ îáúÿâëåíèé). Ñ îäíîé
ñòîðîíû, ýòî óäîáíî ñ òî÷êè çðåíèÿ ðàçäåëüíîé êîìïèëÿöèè, íî ñ äðóãîé ñòîðîíû, ýòî ìîæåò ïðèâåñòè ê êîíôëèêòó
èìåí, ò. å. ìû íå ìîæåì, íàïðèìåð, èìåòü äâå îäíîèìåííûå ãëîáàëüíûå ïåðåìåííûå â ðàçíûõ ôàéëàõ; íå âàæíî,
îäèíàêîâû èõ òèïû èëè ðàçëè÷íû.
Äëÿ ðåøåíèÿ ýòîé ïðîáëåìû ñóùåñòâóåò òàêîå ïîíÿòèå, êàê âíóòðåííåå ñâÿçûâàíèå. Åñëè îíî èñïîëüçóåòñÿ äëÿ
ãëîáàëüíîé ïåðåìåííîé èëè ôóíêöèè, òî îíè íå áóäóò âèäíû â äðóãèõ ôàéëàõ è íå áóäóò ïðèâîäèòü ê êîíôëèêòó
èìåí.
Ïî óìîë÷àíèþ è äëÿ ôóíêöèé, è äëÿ ãëîáàëüíûõ ïåðåìåííûõ èñïîëüçóåòñÿ âíåøíåå ñâÿçûâàíèå. Åñëè æå ìû õîòèì
äëÿ êàêîé-òî ãëîáàëüíîé ïåðåìåííîé èëè ôóíêöèè èñïîëüçîâàòü âíóòðåííåå ñâÿçûâàíèå, ìû äîëæíû ÿâíî óêàçàòü
ýòî, äîáàâèâ ïåðåä ñîîòâåòñòâóþùåé äåêëàðàöèåé êëþ÷åâîå ñëîâî static (ýòî êëþ÷åâîå ñëîâî óæå âñòðå÷àëîñü íàì äëÿ
ëîêàëüíûõ ïåðåìåííûõ, íî òàì îíî èìåëî ñîâåðøåííî äðóãîé ñìûñë).
Íàïèñàòü ôóíêöèþ f (x) = sin2 x è ôóíêöèþ, âû÷èñëÿþùóþ ïðèáëèæåííîå çíà÷åíèå îïðåäåëåííîãî èíòåãðàëà îò
íåå ìåòîäîì ñðåäíèõ ïðÿìîóãîëüíèêîâ (ïî ôîðìóëå
Çàäà÷à.
Z
n
b
f (x)dx ≈
a
1 b−a
b−aX
f (a + (i − )
),
n i=1
2 n
à òàêæå ôóíêöèþ main, âûâîäÿùóþ íà ýêðàí ïðèáëèæåííîå çíà÷åíèå èíòåãðàëà è ðàçìåñòèòü èõ â òðåõ ðàçíûõ
ôàéëàõ. Ñêîìïèëèðîâàòü ïðîåêò è ïîñìîòðåòü, êàê âëèÿåò ðîñò n (íàòóðàëüíûé ïàðàìåòð) íà òî÷íîñòü âû÷èñëåíèé
ïðè a = b = 1. Èçìåíèòü ôóíêöèþ f (x) íà tgx è óáåäèòüñÿ, ÷òî ïåðåêîìïèëèðóåòñÿ òîëüêî ôàéë, ñîäåðæàùèé
îïðåäåëåíèå f . Èçìåíèòü â ïðîöåäóðå âû÷èñëåíèÿ èíòåãðàëà ôîðìóëó íà ôîðìóëó òðàïåöèé
Z
b
f (x)dx ≈
a
n−1
X
b−a
b−a
f (a + i
(f (a) + 2
) + f (b)),
2n
n
i=1
è óáåäèòüñÿ, ÷òî ïåðåêîìïèëèðóåòñÿ òîëüêî ôàéë, ñîäåðæàùèé ôóíêöèþ ïðèáëèæåííîãî âû÷èñëåíèÿ èíòåãðàëà.
9
Ïðåïðîöåññîð
Ïîñëåäíèé ðàçäåë èç òåìû ¾ôóíêöèè¿ ïîñâÿùåí ïðåïðîöåññîðó. Ïðåïðîöåññîð îáðàáàòûâàåò èñõîäíûé ôàéë ïðîãðàììû íà C++ äî òîãî, êàê ýòîò ôàéë ïîñòóïèò íà âõîä êîìïèëÿòîðà.
Ïðåïðîöåññîð ïîçâîëÿåò ðåøàòü ñëåäóþùèå çàäà÷è: âêëþ÷àòü â òåêñò ïðîãðàììû ñîäåðæèìîå äðóãèõ ôàéëîâ,
îïðåäåëÿòü è èñïîëüçîâàòü ìàêðîîïðåäåëåíèÿ, âêëþ÷àòü èëè èñêëþ÷àòü îïðåäåëåííûå ôðàãìåíòû ïðîãðàììû èç
ôàéëà â çàâèñèìîñòè îò èñòèííîñòè íåêîòîðûõ óñëîâèé (òàê íàçûâàåìàÿ óñëîâíàÿ êîìïèëÿöèÿ) è íåêîòîðûå äðóãèå.
Äëÿ óïðàâëåíèÿ ðàáîòîé ïðåïðîöåññîðà èñïîëüçóþòñÿ òàê íàçûâàåìûå äèðåêòèâû ïðåïðîöåññîðà. Êàæäàÿ äèðåêòèâà ïðåïðîöåññîðà îáÿçàòåëüíî äîëæíà çàíèìàòü îäíó îòäåëüíóþ ñòðîêó è íà÷èíàòüñÿ ñ ñèìâîëà #, çà êîòîðûì
èäåò èìÿ äèðåêòèâû. Êðîìå èìåíè, äèðåêòèâà ìîæåò ñîäåðæàòü è äðóãóþ èíôîðìàöèþ, êîòîðàÿ îòäåëÿåòñÿ îò èìåíè
ïðîáåëàìè.
Âêëþ÷åíèå äðóãèõ ôàéëîâ â ïðîãðàììó â îñíîâíîì èñïîëüçóåòñÿ äëÿ íóæä ðàçäåëüíîé êîìïèëÿöèè (ñì. ïðåäûäóùèé ðàçäåë). Äëÿ ýòîãî èñïîëüçóåòñÿ äèðåêòèâà #include, ñ êîòîðîé ìû óæå âñòðå÷àëèñü. Îíà èìååò îäèí ïàðàìåòð
èìÿ âêëþ÷àåìîãî â ïðîãðàììó ôàéëà, âîçìîæíî, ñ óêàçàíèåì åãî ïóòè. Ýòîò ïàðàìåòð ìîæíî çàêëþ÷èòü (êàê ìû
óæå âèäåëè) â óãëîâûå ñêîáêè òîãäà ïðåïðîöåññîð áóäåò èñêàòü ñîîòâåòñòâóþùèé ôàéë â ñïåöèàëüíûõ ñèñòåìíûõ
ïàïêàõ. Òàêîé âàðèàíò èñïîëüçóåòñÿ äëÿ çàãîëîâî÷íûõ ôàéëîâ, ñîäåðæàùèõ ïðîòîòèïû ôóíêöèé èç ñòàíäàðòíîé áèáëèîòåêè ÿçûêà C++, ò. å. òåõ ñòàíäàðòíûõ ôóíêöèé, êîòîðûå ðàññìàòðèâàþòñÿ êàê ÷àñòü ÿçûêà; íàïðèìåð, ôóíêöèè
ââîäà-âûâîäà (ôàéë iostream) èëè ìàòåìàòè÷åñêèå ôóíêöèè (ôàéë cmath). Îäíàêî, ìîæíî çàêëþ÷èòü èìÿ âñòàâëÿåìîãî ôàéëà è â äâîéíûå êàâû÷êè. Òàêîé âàðèàíò îçíà÷àåò ïîèñê ôàéëà â ïàïêàõ, îòâåäåííûõ äëÿ ïîëüçîâàòåëüñêèõ
çàãîëîâî÷íûõ ôàéëîâ (îáû÷íî âõîäÿùèõ â ïðîåêò).
Ñëåäóþùàÿ ãðóïïà äèðåêòèâ ïðåïðîöåññîðà êàñàåòñÿ ìàêðîîïðåäåëåíèé. Äëÿ ñîçäàíèÿ ìàêðîîïðåäåëíèé èñïîëüçóåòñÿ äèðåêòèâà #dene, äëÿ óíè÷òîæåíèÿ #undef. Ìàêðîîïðåäåëåíèÿ áûâàþò ñ ïàðàìåòðàìè èëè áåç íèõ.
Ìàêðîîïðåäåëåíèå áåç ïàðàìåòðîâ ýòî ïðîñòî èäåíòèôèêàòîð, êàæäîå âõîæäåíèå êîòîðîãî â òåêñò ïðîãðàììû
(íå êàê ÷àñòü äðóãîãî èäåíèôèêàòîðà èëè ñòðîêîâîé êîíñòàíòû) çàìåíÿåòñÿ íà îïðåäåëåííóþ ñòðîêó.  ÿçûêå C ýòî
áûë åäèíñòâåííûé ñïîñîá îïèñûâàòü êîíñòàíòû. Íàïðèìåð, ñëåäóþùàÿ ñòðîêà îïðåäåëÿåò êîíñòàíòó pi â ñòèëå ÿçûêà
C:
#define pi 3.1415926
 ýòîì ñëó÷àå â âûðàæåíèè pi+1 ñëîâî pi áóäåò çàìåíåíî íà 3.1415926. À âîò â âûðàæåíèÿõ pie-3 èëè cout¾"pi="òàêàÿ
çàìåíà óæå íå áóäåò âûïîëíåíà.
Òàêîé ñïîñîá îïðåäåëåíèÿ êîíñòàíò ñîõðàíèëñÿ è â C++; îäíàêî, ëó÷øå ïîëüçîâàòüñÿ ñïîñîáîì ñ èñïîëüçîâàíèåì
êëþ÷åâîãî ñëîâà const:
const double pi=3.1415926;
Òàêîé ñïîñîá ëó÷øå ñ òî÷êè çðåíèÿ îáíàðóæåíèÿ îøèáîê. Íàïðèìåð, åñëè íàïèñàòü (ñëó÷àéíî)
#define pi 3.1415926;
òî âìåñòî (1+pi)/2 êîìïèëÿòîð óâèäèò (1+3.1415926;)/2, è ïîíÿòü, â ÷åì æå çäåñü îøèáêà, áóäåò î÷åíü íåïðîñòî,
ïîñêîëüêó îïðåäåëåíèÿ êîíñòàíò îáû÷íî âñòðå÷àþòñÿ â íà÷àëå ôàéëà è ýòî ìîæåò áûòü äîñòàòî÷íî äàëåêî îò ìåñòà,
ãäå ñòîèò òàêîå âûðàæåíèå.
Ïðîáëåìà â òîì, ÷òî ïðåïðîöåññîðó âñå ðàâíî, ÷òî íà ÷òî çàìåíÿòü îí íå âíèêàåò â ñìûñë òåõ ñòðîê, êîòîðûå ïîäñòàâëÿåò âìåñòî ìàêðîîïðåäåëåíèé, à âòîðîé ñïîñîá îïðåäåëåíèÿ êîíñòàíò ïîçâîëÿåò êîìïèëÿòîðó C++ îñóùåñòâëÿòü
ïðîâåðêó òèïîâ â òåõ âûðàæåíèÿõ, â êîòîðûõ ýòè êîíñòàíòû èñïîëüçóþòñÿ. Âîîáùå, ïðîâåðêà òèïîâ âåùü î÷åíü
ïîëåçíàÿ äëÿ îáíàðóæåíèÿ îøèáîê åùå íà ýòàïå êîìïèëÿöèè ïðîãðàììû, è îíà èãðàåò â ïðîãðàììèðîâàíèè ïðèìåðíî
òó æå ðîëü, êàêóþ èãðàåò â ôèçèêå ïðîâåðêà ôîðìóëû ïî åäèíèöàì èçìåðåíèÿ âõîäÿùèõ â ôîðìóëó âåëè÷èí.
Ìàêðîîïðåäåëåíèÿ áûâàþò òàêæå ñ ïàðàìåòðàìè. Ïðè îïðåäåëåíèè èõ ïîñëå èìåíè ìàêðîïðåäåëåíèÿ â ñêîáêàõ
ñòîÿò ÷åðåç çàïÿòóþ èìåíà ïàðàìåòðîâ, êîòîðûå òàêæå ìîãóò âñòðå÷àòüñÿ è â òîé ñòðîêå, íà êîòîðóþ ìàêðîîïðåäåëíèå
íàäî çàìåíÿòü (â äàëüíåéøåì ìû áóäåì íàçûâàòü ýòó ñòðîêó òåêñòîì çàìåíû). Ïðè èñïîëüçîâàíèè ìàêðîîïðåäåëåíèÿ
ñ ïàðàìåòðàìè ïîñëå åãî èìåíè â ñêîáêàõ ÷åðåç çàïÿòóþ óêàçûâàþòñÿ çíà÷åíèÿ ïàðàìåòðîâ. Âñÿ ýòà êîíñòðóêöèÿ
çàìåíÿåòñÿ íà òåêñò çàìåíû, â êîòîðîì èìåíà ïàðàìåòðîâ ìàêðîîïðåäåëíèÿ çàìåíåíû íà èõ çíà÷åíèÿ.
Ìàêðîîïðåäåëåíèÿ ñ ïàðàìåòðàìè ìîæíî èñïîëüçîâàòü äëÿ ðàçíûõ öåëåé. Íàïðèìåð, äëÿ êîíñòðóêöèé âðîäå
va_arg (íàïîìíèì, ÷òî âòîðûì ïàðàìåòðîì ýòîé êîíñòðóêöèè ÿâëÿåòñÿ òèï îáû÷íàÿ ôóíêöèÿ íå ìîæåò èìåòü
òàêèõ ïàðàìåòðîâ). Òàêæå ìîæíî èñïîëüçîâàòü èõ äëÿ ýêîíîìèè âðåìåíè âûïîëíåíèÿ äëÿ íåáîëüøèõ ôóíêöèé, ÷òîáû íå òðàòèòü âðåìÿ âûïîëíåíèÿ íà âûçîâ ôóíêöèè. Íàïðèìåð, ñëåäóþùåå ìàêðîîïðåäåëåíèå âû÷èñëÿåò êâàäðàò
ñâîåãî ïàðàìåòðà áåç çàòðàò âðåìåíè íà âûçîâ ôóíêöèè:
#define sqr(X) ((X)*(X))
×òîáû ïîíÿòü, çà÷åì çäåñü ñòîëüêî ñêîáîê, äîñòàòî÷íî ðàññìîòðåòü âûðàæåíèå sqr(y+1).
Íàïèñàòü ìàêðîîïðåäåëåíèå, âû÷èñëÿþùåå ôóíêöèþ f (x) = x3 − x2 + 5x − 3.
Êàê è â ñëó÷àå ñ îïðåäåëåíèåì êîíñòàíò, ÿçûê C++ ïðåäëàãàåò áîëåå óäîáíûå ñðåäñòâà äëÿ êàæäîãî èç ýòèõ ïðèìåíåíèé ìàêðîîïðåäåëåíèé. Ñðåäñòâîì äëÿ èñïîëüçîâàíèÿ òèïîâûõ ïàðàìåòðîâ ÿâëÿþòñÿ øàáëîíû, à äëÿ íåáîëüøèõ
ôóíêöèé, äëÿ êîòîðûõ ìû íå õîòèì òåðÿòü âðåìÿ íà âûçîâ òàê íàçûâàåìûå ïîäñòàâëÿåìûå ôóíêöèè, òåëî êîòîðûõ ïðè êîìïèëÿöèè âûçîâà ïðîñòî âñòàâëÿåòñÿ öåëèêîì â òî÷êó âûçîâà âìåñòî îôîðìëåíèÿ îáû÷íîé äëÿ ôóíêöèé
êîíñòðóêöèè âûçîâà íà ìàøèííîì ÿçûêå.
Äëÿ òîãî, ÷òîáû ñäåëàòü ôóíêöèþ ïîäñòàâëÿåìîé, äîñòàòî÷íî ïðîñòî íàïèñàòü inline ïåðåä äåêëàðàöèåé. Ïðàâäû
ðàäè íóæíî çàìåòèòü, ÷òî â áîëüøèíñòâå êîìïèëÿòîðîâ ýòî ðàññìàòðèâàåòñÿ êàê ñîâåò, à íå êàê ïðèêàç, ò. å. êîìïèëÿòîð ìîæåò ïî ñâîåìó óñìîòðåíèþ îòêàçàòüñÿ äåëàòü ýòó ôóíêöèþ ïîäñòàâëÿåìîé, íàïðèìåð, åñëè ãäå-òî â ïðîãðàììå
èñïîëüçóåòñÿ åå àäðåñ èëè ýòà ôóíêöèÿ èñïîëüçóåò ðåêóðñèþ.
Èìåþòñÿ òàêæå äâå óäîáíûå îïåðàöèè ïðåïðîöåññîðà, îáû÷íî èñïîëüçóåìûå äëÿ ïàðàìåòðîâ ìàêðîîïðåäåëåíèé.
Ýòî îïåðàöèÿ ¾çàêàâû÷èâàíèÿ¿, ïðåäñòàâëåííàÿ çíà÷êîì # è îïåðàöèÿ ¾ñöåïëåíèÿ ëåêñåì¿ ##. Ïåðâàÿ èñïîëüçóåòñÿ
òîãäà, êîãäà íóæíî ïðåâðàòèòü çíà÷åíèå ïàðàìåòðà ìàêðîîïðåäåëåíèÿ â ñòðîêîâóþ êîíñòàíòó. Íàïðèìåð, ìû õîòèì
íàïèñàòü ìàêðîîïðåäåëåíèå, ïàðàìåòðîì êîòîðîãî ÿâëÿåòñÿ èìÿ ïåðåìåííîé, à çíà÷åíèåì âûâîä ÷åãî-òî âðîäå
¾èìÿ=çíà÷åíèå¿. Ýòî äåëàåòñÿ òàê:
Çàäà÷à.
#define out(X) (cout<<#X<<"="<<X)
Çäåñü out(abc) áóäåò çàìåíåíî íà
(cout<<"abc"<<"="<<abc)
Âîñïîëüçîâàâøèñü ïðàâèëîì ÿçûêà C î òîì, ÷òî äâå èäóùèå ïîäðÿä ñòðîêîâûå êîíñòàíòû ñöåïëÿþòñÿ âìåñòå, ìîæíî
íàïèñàòü òî æå ñàìîå è ïðîùå:
#define out(X) (cout<<#X "="<<X)
Ýòà îïåðàöèÿ íåîáõîäèìà ïîòîìó, ÷òî åñëè ïîñòàâèòü èìÿ ïàðàìåòðà ìàêðîîïðåäåëåíèÿ âíóòðè êàâû÷åê, îíî íå
áóäåò çàìåíÿòüñÿ íà çíà÷åíèå ýòîãî ïàðàìåòðà ïðè ïîäñòàíîâêå ìàêðîîïðåäåëåíèÿ.
Îïåðàöèÿ ñöåïëåíèÿ ëåêñåì èñïîëüçóåòñÿ òîãäà, êîãäà ìû õîòèì ïîëó÷èòü èç ïàðàìåòðà ìàêðîîïðåäåëåíèÿ (äîïóñòèì, ÷òî ýòî èäåíòèôèêàòîð) íîâûé èäåíòèôèêàòîð, ïðèïèñàâ ÷òî-òî ê íåìó. Íàïðèìåð, ìû õîòèì íàïèñàòü ìàêðîîïðåäåëåíèå newvar, ïðèíèìàþùåå èìÿ ïåðåìåííîé â êà÷åñòâå ïàðàìåòðà è âûäàþùåå íîâîå èìÿ ïåðåìåííîé, ïîëó÷åííîå
èç ñòàðîãî äîïèñûâàíèåì ê íåìó ñçàäè ñèìâîëà 1. Ýòà çàäà÷à ðåøàåòñÿ òàê:
#define newvar(X) X##1
Ýòà îïåðàöèÿ íåîáõîäèìà ïîòîìó, ÷òî åñëè íàïèñàòü X 1, òî ïðè ïîäñòàíîâêå çíà÷åíèÿ ïàðàìåòðà X ïðîáåë ìåæäó
íèì è 1 ñîõðàíèòñÿ, à åñëè íàïèñàòü X1, òî ýòî áóäåò íîâûé èäåíòèôèêàòîð, è âõîäÿùèé â åãî ñîñòàâ X íå áóäåò
çàìåíÿòüñÿ íà çíà÷åíèå ñîîòâåòñòâóþùåãî ïàðàìåòðà ìàêðîîïðåäåëåíèÿ.
Äëÿ óäàëåíèÿ ìàêðîîïðåäåëåíèÿ èñïîëüçóåòñÿ äèðåêòèâà #undef, åäèíñòâåííûì ïàðàìåòðîì êîòîðîé ÿâëÿåòñÿ èìÿ
óäàëÿåìîãî ìàêðîîïðåäåëåíèÿ. Ïîñëå ýòîé äèðåêòèâû äî ñëåäóþùåãî îïðåäåëåíèÿ òîãî æå ìàêðîîïðåäåëåíèÿ (åñëè
îíî âîîáùå ïîñëåäóåò) ýòî èìÿ ïåðåñòàåò ðàñïîçíàâàòüñÿ êàê èìÿ ìàêðîîïðåäåëåíèÿ, è ñëåäîâàòåëüíî, çàìåíÿòüñÿ íà
÷òî áû òî íè áûëî, à ïîïàäàåò íà âûõîä ïðåïðîöåññîðà êàê åñòü.
Ñëåäóþùàÿ ãðóïïà äèðåêòèâ îáñëóæèâàåò òàê íàçûâàåìóþ óñëîâíóþ êîìïèëÿöèþ. Äèðåêòèâû ýòîé ãðóïïû ïîçâîëÿþò ïðîâåðÿòü èñòèííîñòü íåêîòîðûõ óñëîâèé è â çàâèñèìîñòè îò ýòîãî âêëþ÷àòü â ïðîãðàììó èëè èñêëþ÷àòü èç íåå
òå èëè èíûå ôðàãìåíòû. Òàêàÿ âîçìîæíîñòü èñïîëüçóåòñÿ äëÿ àâòîìàòè÷åñêîé íàñòðîéêè ïðîãðàììû íà êîìïèëÿöèþ
íà ðàçíûõ ïëàòôîðìàõ (îïåðàöèîííàÿ ñèñòåìà+êîìïèëÿòîð+ïðîöåññîð) èëè äëÿ ïîëó÷åíèÿ èç îäíîãî èñõîäíîãî ôàéëà íåñêîëüêèõ âàðèàíòîâ ïðîãðàììû, íàïðèìåð, îòëàäî÷íîé âåðñèè, ïðîâåðÿþùåé ìíîãî äîïîëíèòåëüíûõ óñëîâèé è
îñóùåñòâëÿþùåé îòëàäî÷íûé âûâîä, è ðàáî÷åé âåðñèè, â êîòîðîé íè÷åãî ýòîãî íåò.
Äèðåêòèâû óñëîâíîé êîìïèëÿöèè â ñàìîì îáùåì âèäå èñïîëüçóþòñÿ ñëåäóþùèì îáðàçîì:
#if óñëîâèå1
òåêñò1
#elif óñëîâèå2
òåêñò2
...
#elif óñëîâèåN
òåêñòN
#else
òåêñòN+1
#endif
Ñìûñë ýòîé êîíñòðóêöèè ñîñòîèò â ñëåäóþùåì. Åñëè óñëîâèå1 èñòèííî, òî âìåñòî âñåé ýòîé êîíñòðóêöèè â âûõîä
ïðåïðîöåññîðà ïîïàäàåò òîëüêî òåêñò1; åñëè óñëîâèå1 ëîæíî, íî óñëîâèå2 èñòèííî, òî òåêñò2, è ò. ä. Íàêîíåö, åñëè
âñå óñëîâèÿ ëîæíû, â âûõîä ïîïàäàåò òîëüêî òåêñòN+1.  èòîãå ìû ïîëó÷àåì âîçìîæíîñòü âûáèðàòü òîò âàðèàíò,
êîòîðûé áîëüøå ïîäõîäèò äëÿ êîíêðåòíîé ñèòóàöèè.
Òåïåðü îá óñëîâèÿõ.  ñàìîì îáùåì ñëó÷àå óñëîâèå ìîæåò ñîäåðæàòü ñëåäóþùåå: öåëûå êîíñòàíòû (ÿâíî âûïèñàííûå öåëûå ÷èñëà), àðèôìåòè÷åñêèå, áèòîâûå è ëîãè÷åñêèå îïåðàöèè, îïåðàöèè ñðàâíåíèÿ, ìàêðîîïðåäåëåíèÿ (êîòîðûå
çàìåíÿþòñÿ íà ñâîè çíà÷åíèÿ), ñïåöèàëüíûå êîíñòðóêöèè, èç êîòîðûõ óïîìÿíåì òîëüêî êîíñòðóêöèþ dened(èìÿ),
èìåþùóþ çíà÷åíèå 1, åñëè èìÿ ÿâëÿåòñÿ èìåíåì íåêîòîðîãî ìàêðîîïðåäåëåíèÿ, è 0 èíà÷å (ïðè ýòîì ñîâåðøåííî
íåâàæíî çíà÷åíèå ýòîãî ìàêðîîïðåäåëåíèÿ, ò. å. íà êàêóþ ñòðîêó åãî íàäî çàìåíÿòü) è èäåíòèôèêàòîðû (îíè ñ÷èòàþòñÿ èìåþùèìè çíà÷åíèå íîëü, äàæå åñëè îíè îáúÿâëåíû êàê êîíñòàíòû â ñòèëå C++ ñ ÿâíî óêàçàííûì çíà÷åíèåì).
Òðàêòîâêà óñëîâèé òàêàÿ æå, êàê è â óñëîâíîì îïåðàòîðå: 0 ëîæü, âñå îñòàëüíîå èñòèíà.
Äëÿ ñîêðàùåíèÿ òåêñòîâ ïðîãðàìì èìåþòñÿ äâå ðàçíîâèäíîñòè äèðåêòèâû #if: #ifdef èìÿ è #ifndef èìÿ. Ïåðâàÿ
ïðîâåðÿåò, ÷òî èìÿ ÿâëÿåòñÿ èìåíåì íåêîòîðîãî ìàêðîîïðåäåëåíèÿ (ñèíîíèì #if dened(èìÿ)), à âòîðàÿ íàîáîðîò
(ñèíîíèì #if ! dened(èìÿ)).
Âìåñòå ñ äèðåêòèâàìè óñëîâíîé êîìïèëÿöèè ÷àñòî èñïîëüçóåòñÿ äèðåêòèâà #error òåêñò. Îíà âûäàåò òåêñò â êà÷åñòâå ñîîáùåíèÿ îá îøèáêå è çàâåðøàåò êîìïèëÿöèþ. Íàïðèìåð, åñëè ó íàñ â ïðîãðàììå îïðåäåëÿþòñÿ äâå êîíñòàíòû
M è N (â ñòèëå C), è ñðåäè âñåõ âîçìîæíûõ ïàð èõ çíà÷åíèé ïî ëîãèêå ïðîãðàììû îñìûñëåííû òîëüêî òàêèå, ãäå
M<N, òî ýòî óñëîâèå ìîæåò áûòü ïðîâåðåíî íà ýòàïå êîìïèëÿöèè ïðè ïîìîùè ñëåäóþùåãî ôðàãìåíòà:
#if M>=N
#error M must be < N
#endif
 êà÷åñòâå åùå îäíîãî ïðèìåðà ðàññìîòðèì òàê íàçûâàåìûé ñòîðîæ (êîíñòðóêöèÿ, êîòîðàÿ ïðèâîäèò ê òîìó, ÷òî
çàùèùåííûé ñ åå ïîìîùüþ ôàéë ìîæåò áûòü âêëþ÷åí â ëþáîé äðóãîé ôàéë íå áîëåå îäíîãî ðàçà).
#ifndef FILENAME
#define FILENAME
ñîäåðæèìîå ôàéëà
#endif
Çäåñü âìåñòî FILENAME äîëæíî ñòîÿòü óíèêàëüíîå èìÿ, îáû÷íî ñâÿçàííîå ñ èìåíåì òîãî ôàéëà, êîòîðûé çàùèùàåòñÿ ñòîðîæåì. Åñëè ìû âêëþ÷àåì òàêîé ôàéë â êàêîé-òî äðóãîé ïåðâûé ðàç, òàêîãî ìàêðîîïðåäåëåíèÿ òàì åùå íåò è
ñîäåðæèìîå íàøåãî ôàéëà äåéñòâèòåëüíî ïîïàäàåò â ýòîò ôàéë, íî âìåñòå ñ òåì òàì ïîÿâëÿåòñÿ è ýòî ìàêðîîïðåäåëåíèå, òàê ÷òî ïðè ïîâòîðíûõ ïîïûòêàõ âêëþ÷èòü çàùèùàåìûé ôàéë â òîò æå ôàéë, äèðåêòèâà óñëîâíîé êîìïèëÿöèè
íå äîïóñòèò ýòîãî, ïîñêîëüêó òåïåðü óæå óïîìèíàþùååñÿ â íåé èìÿ áóäåò èìåíåì ìàêðîîïðåäåëåíèÿ è óñëîâèå áóäåò
ëîæíûì.
Íàïèñàòü êîíñòðóêöèþ ïîäîáíîãî ðîäà (íàçîâåì åå ñóïåðñòîðîæ), êîòîðàÿ ïðåïÿòñòâóåò âêëþ÷åíèþ çàùèùàåìîãî åþ ôàéëà â äðóãîé ôàéë áîëåå äâóõ ðàç (îäèí è äâà ðàçà ìîæíî, à áîëüøå íå âêëþ÷àåòñÿ).
Íàêîíåö, ðàññìîòðèì êîíñòðóêöèþ, âûãëÿäÿùóþ êàê äèðåêòèâà ïðåïðîöåññîðà, íî íà ñàìîì äåëå íå èìåþùóþ ê
ïðåïðîöåññîðó íèêàêîãî îòíîøåíèÿ. Ýòà êîíñòðóêöèÿ èìååò ñëåäóþùèé ñèíòàêñèñ:
Çàäà÷à.
#pragma ïàðàìåòðû
Îíà èñïîëüçóåòñÿ äëÿ óêàçàíèé êîìïèëÿòîðó. Êàê ïðàâèëî, ïàðàìåòðû íà÷èíàþòñÿ ñ òðåõáóêâåííîãî êîäà, êîòîðûé
ãîâîðèò î òîì, êàêîìó êîìïèëÿòîðó àäðåñîâàíû óêàçàíèÿ èëè î ÷åì îíè, è åñëè òîò êîìïèëÿòîð, êîòîðûé êîìïèëèðóåò
ýòó ïðîãðàììó, íå ïîíèìàåò ýòîãî êîäà, òî óêàçàíèÿ ïðîñòî èãíîðèðóþòñÿ. Õîðîøèé ñòèëü íàïèñàíèÿ ïðîãðàìì
ñîñòîèò â òîì, ÷òîáû ïðîãðàììà ðàáîòàëà è âûäàâàëà ïðàâèëüíûé ðåçóëüòàò íåçàâèñèìî îò òîãî, ïîíèìàåò êîíêðåòíûé
êîìïèëÿòîð ñîäåðæàùèåñÿ â íåé óêàçàíèÿ èëè íåò (ò. å. óêàçàíèÿ äîëæíû âëèÿòü òîëüêî íà îïòèìèçàöèþ, íî íå íà
ðàáîòîñïîñîáíîñòü ïðîãðàììû). ×àùå âñåãî òàêîãî ðîäà óêàçàíèÿ êàñàþòñÿ ðàñïàðàëëåëèâàíèÿ ïðîãðàììû, è åñëè
êîìïèëÿòîð èõ íå ïîíèìàåò, ïðîñòî ïðîãðàììà ïîëó÷àåòñÿ ïîñëåäîâàòåëüíîé (ò. å. áåç ðàñïàðàëëåëèâàíèÿ).
Download