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 ïàðàìåòðû Îíà èñïîëüçóåòñÿ äëÿ óêàçàíèé êîìïèëÿòîðó. Êàê ïðàâèëî, ïàðàìåòðû íà÷èíàþòñÿ ñ òðåõáóêâåííîãî êîäà, êîòîðûé ãîâîðèò î òîì, êàêîìó êîìïèëÿòîðó àäðåñîâàíû óêàçàíèÿ èëè î ÷åì îíè, è åñëè òîò êîìïèëÿòîð, êîòîðûé êîìïèëèðóåò ýòó ïðîãðàììó, íå ïîíèìàåò ýòîãî êîäà, òî óêàçàíèÿ ïðîñòî èãíîðèðóþòñÿ. Õîðîøèé ñòèëü íàïèñàíèÿ ïðîãðàìì ñîñòîèò â òîì, ÷òîáû ïðîãðàììà ðàáîòàëà è âûäàâàëà ïðàâèëüíûé ðåçóëüòàò íåçàâèñèìî îò òîãî, ïîíèìàåò êîíêðåòíûé êîìïèëÿòîð ñîäåðæàùèåñÿ â íåé óêàçàíèÿ èëè íåò (ò. å. óêàçàíèÿ äîëæíû âëèÿòü òîëüêî íà îïòèìèçàöèþ, íî íå íà ðàáîòîñïîñîáíîñòü ïðîãðàììû). ×àùå âñåãî òàêîãî ðîäà óêàçàíèÿ êàñàþòñÿ ðàñïàðàëëåëèâàíèÿ ïðîãðàììû, è åñëè êîìïèëÿòîð èõ íå ïîíèìàåò, ïðîñòî ïðîãðàììà ïîëó÷àåòñÿ ïîñëåäîâàòåëüíîé (ò. å. áåç ðàñïàðàëëåëèâàíèÿ).