Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
71
Добавлен:
26.05.2014
Размер:
64.63 Кб
Скачать

вШСТО уФТБХУФТБР. чЧЕДЕОЙЕ Ч СЪЩЛ уЙ++, чЩТБЦЕОЙС Й ПРЕТБФПТЩ A.noneline { font-family: Arial, Serif; text-decoration: none; } FONT.arial { font-family: Arial, Serif; } TD.arial { font-family: Arial, Serif; } TH.arial { font-family: Arial, Serif; } PRE { font-family: Monospace; color: navy; } SAMP { font-family: Monospace; color: navy; } TT { font-family: Monospace; color: navy; } VAR { font-family: Monospace; color: navy; }

уЕТЧЕТ РПДДЕТЦЙЧБЕФУС

гЕОФТПН йОЖПТНБГЙПООЩИ фЕИОПМПЗЙК

(095) 932-9212, 932-9213, 939-0783

E-mail: info@citforum.ru уЕТЧЕТ йОЖПТНБГЙПООЩИ фЕИОПМПЗЙК УПДЕТЦЙФ НПТЕ(!) БОБМЙФЙЮЕУЛПК ЙОЖПТНБГЙЙ зМБЧБ 4 жХОЛГЙЙ Й жБКМЩ йФЕТБГЙС УЧПКУФЧЕООБ ЮЕМПЧЕЛХ, ТЕЛХТУЙС ВПЦЕУФЧЕООБ. - м. рЙФЕТ дПКЮ чУЕ ОЕФТЙЧЙБМШОЩЕ РТПЗТБННЩ УПВЙТБАФУС ЙЪ ОЕУЛПМШЛЙИ ТБЪДЕМШОП ЛПНРЙМЙТХЕНЩИ ЕДЙОЙГ (ЙИ РТЙОСФП ОБЪЩЧБФШ РТПУФП ЖБКМБНЙ). ч ЬФПК ЗМБЧЕ ПРЙУБОП, ЛБЛ ТБЪДЕМШОП ПФЛПНРЙМЙТПЧБООЩЕ ЖХОЛГЙЙ НПЗХФ ПВТБЭБФШУС ДТХЗ Л ДТХЗХ, ЛБЛ ФБЛЙЕ ЖХОЛГЙЙ НПЗХФ УПЧНЕУФОП РПМШЪПЧБФШУС ДБООЩНЙ (ТБЪДЕМСФШ ДБООЩЕ), Й ЛБЛ НПЦОП ПВЕУРЕЮЙФШ УПЗМБУПЧБООПУФШ ФЙРПЧ, ЛПФПТЩЕ ЙУРПМШЪХАФУС Ч ТБЪОЩИ ЖБКМБИ РТПЗТБННЩ. жХОЛГЙЙ ПВУХЦДБАФУС ДПЧПМШОП РПДТПВОП. уАДБ ЧИПДСФ РЕТЕДБЮБ РБТБНЕФТПЧ, РБТБНЕФТЩ РП ХНПМЮБОЙА, РЕТЕЗТХЪЛБ ЙНЕО ЖХОЛГЙК, Й, ЛПОЕЮОП ЦЕ, ПРЙУБОЙЕ Й ПРТЕДЕМЕОЙЕ ЖХОЛГЙК. ч ЛПОГЕ ПРЙУЩЧБАФУС НБЛТПУЩ. 4.1 чЧЕДЕОЙЕ йНЕФШ ЧУА РТПЗТБННХ Ч ПДОПН ЖБКМЕ ПВЩЮОП ОЕЧПЪНПЦОП, РПУЛПМШЛХ ЛПДЩ УФБОДБТФОЩИ ВЙВМЙПФЕЛ Й ПРЕТБГЙПООПК УЙУФЕНЩ ОБИПДСФУС ЗДЕ-ФП Ч ДТХЗПН НЕУФЕ. лТПНЕ ФПЗП, ИТБОЙФШ ЧЕУШ ФЕЛУФ РПМШЪПЧБФЕМШУЛПК РТПЗТБННЩ Ч ПДОПН ЖБКМЕ ЛБЛ РТБЧЙМП ОЕРТБЛФЙЮОП Й ОЕХДПВОП. уРПУПВ ПТЗБОЙЪБГЙЙ РТПЗТБННЩ Ч ЖБКМЩ НПЦЕФ РПНПЮШ ЮЙФБАЭЕНХ ПИЧБФЙФШ ЧУА УФТХЛФХТХ РТПЗТБННЩ, Б ФБЛЦЕ НПЦЕФ ДБФШ ЧПЪНПЦОПУФШ ЛПНРЙМСФПТХ ТЕБМЙЪПЧБФШ ЬФХ УФТХЛФХТХ. рПУЛПМШЛХ ЕДЙОЙГЕК ЛПНРЙМСГЙЙ СЧМСЕФУС ЖБКМ, ФП ЧП ЧУЕИ УМХЮБСИ, ЛПЗДБ Ч ЖБКМ ЧОПУЙФУС ЙЪНЕОЕОЙЕ (УЛПМШ ВЩ НБМП ПОП ОЙ ВЩМП), ЧЕУШ ЖБКМ ОХЦОП ЛПНРЙМЙТПЧБФШ ЪБОПЧП. дБЦЕ ДМС РТПЗТБННЩ ХНЕТЕООЩИ ТБЪНЕТПЧ ЧТЕНС, ЪБФТБЮЙЧБЕНПЕ ОБ РЕТЕЛПНРЙМСГЙА, НПЦОП ЪОБЮЙФЕМШОП УОЙЪЙФШ У РПНПЭША ТБЪВЙЕОЙС РТПЗТБННЩ ОБ ЖБКМЩ РПДИПДСЭЙИ ТБЪНЕТПЧ.

тБУУНПФТЙН РТЙНЕТ У ЛБМШЛХМСФПТПН. пО ВЩМ РТЕДУФБЧМЕО Ч ЧЙДЕ ПДОПЗП ЙУИПДОПЗП ЖБКМБ. еУМЙ ЧЩ ЕЗП ОБВЙМЙ, ФП Х ЧБУ ОБЧЕТОСЛБ ВЩМЙ ОЕВПМШЫЙЕ ФТХДОПУФЙ У ТБУРПМПЦЕОЙЕН ПРЙУБОЙК Ч РТБЧЙМШОПН РПТСДЛЕ, Й РТЙЫМПУШ ЙУРПМШЪПЧБФШ РП НЕОШЫЕК НЕТЕ ПДОП "ЖБМШЫЙЧПЕ" ПРЙУБОЙЕ, ЮФПВЩ ЛПНРЙМСФПТ УНПЗ ПВТБВПФБФШ ЧЪБЙНОП ТЕЛХТУЙЧОЩЕ ЖХОЛГЙЙ expr(), term() Й prim(). ч ФЕЛУФЕ ХЦЕ ПФНЕЮБМПУШ, ЮФП РТПЗТБННБ УПУФПЙФ ЙЪ ЮЕФЩТЕИ ЮБУФЕК (МЕЛУЙЮЕУЛПЗП БОБМЙЪБФПТБ, РТПЗТБННЩ УЙОФБЛУЙЮЕУЛПЗП ТБЪВПТБ, ФБВМЙГЩ ЙНЕО Й ДТБКЧЕТБ), ОП ЬФП ОЙЛБЛ ОЕ ВЩМП ПФТБЦЕОП Ч ФЕЛУФЕ УБНПК РТПЗТБННЩ. рП УХФЙ ДЕМБ, ЛБМШЛХМСФПТ ВЩМ ОБРЙУБО РП-ДТХЗПНХ. фБЛ ЬФП ОЕ ДЕМБЕФУС; ДБЦЕ ЕУМЙ Ч ЬФПК РТПЗТБННЕ "ОБ ЧЩВТПУ" РТЕОЕВТЕЮШ ЧУЕНЙ УППВТБЦЕОЙСНЙ НЕФПДПМПЗЙЙ РТПЗТБННЙТПЧБОЙС, ЬЛУРМХБФБГЙЙ Й ЬЖЖЕЛФЙЧОПУФЙ ЛПНРЙМСГЙЙ, БЧФПТ ЧУЕ ТБЧОП ТБЪПВШЕФ ЬФХ РТПЗТБННХ Ч 200 УФТПЛ ОБ ОЕУЛПМШЛП ЖБКМПЧ, ЮФПВЩ РТПЗТБННЙТПЧБФШ ВЩМП РТЙСФОЕЕ.

рТПЗТБННБ, УПУФПСЭБС ЙЪ ОЕУЛПМШЛЙИ ТБЪДЕМШОП ЛПНРЙМЙТХЕНЩИ ЖБКМПЧ, ДПМЦОБ ВЩФШ УПЗМБУПЧБООПК Ч УНЩУМЕ ЙУРПМШЪПЧБОЙС ЙНЕО Й ФЙРПЧ, ФПЮОП ФБЛ ЦЕ, ЛБЛ Й РТПЗТБННБ, УПУФПСЭБС ЙЪ ПДОПЗП ЙУИПДОПЗП ЖБКМБ. ч РТЙОГЙРЕ, ЬФП НПЦЕФ ПВЕУРЕЮЙФШ Й ЛПНРПОПЧЭЙЛ*1. лПНРПОПЧЭЙЛ - ЬФП РТПЗТБННБ, УФЩЛХАЭБС ПФДЕМШОП УЛПНРЙМЙТПЧБООЩЕ ЮБУФЙ ЧНЕУФЕ. лПНРПОПЧЭЙЛ ЮБУФП (РХФБС) ОБЪЩЧБАФ ЪБЗТХЪЮЙЛПН. ч UNIX'Е ЛПНРПОПЧЭЙЛ ОБЪЩЧБЕФУС ld. пДОБЛП ЛПНРПОПЧЭЙЛЙ, ЙНЕАЭЙЕУС Ч ВПМШЫЙОУФЧЕ УЙУФЕН, ПВЕУРЕЮЙЧБАФ ПЮЕОШ УМБВХА РПДДЕТЦЛХ РТПЧЕТЛЙ УПЗМБУПЧБООПУФЙ.

рТПЗТБННЙУФ НПЦЕФ УЛПНРЕОУЙТПЧБФШ ОЕДПУФБФПЛ РПДДЕТЦЛЙ УП УФПТПОЩ ЛПНРПОПЧЭЙЛБ, РТЕДПУФБЧЙЧ ДПРПМОЙФЕМШОХА ЙОЖПТНБГЙА П ФЙРБИ (ПРЙУБОЙС). рПУМЕ ЬФПЗП УПЗМБУПЧБООПУФШ РТПЗТБННЩ ПВЕУРЕЮЙЧБЕФУС РТПЧЕТЛПК УПЗМБУПЧБООПУФЙ ПРЙУБОЙК, ЛПФПТЩЕ ОБИПДСФУС Ч ПФДЕМШОП ЛПНРЙМЙТХЕНЩИ ЮБУФСИ. уТЕДУФЧБ, ЛПФПТЩЕ ЬФП ПВЕУРЕЮЙЧБАФ, Ч ЧБЫЕК УЙУФЕНЕ ВХДХФ. C++ ТБЪТБВПФБО ФБЛ, ЮФПВЩ УРПУПВУФЧПЧБФШ ФБЛПК СЧОПК ЛПНРПОПЧЛЕ*2. 4.2 лПНРПОПЧЛБ еУМЙ ОЕ ХЛБЪБОП ЙОПЕ, ФП ЙНС, ОЕ СЧМСАЭЕЕУС МПЛБМШОЩН ДМС ЖХОЛГЙЙ ЙМЙ ЛМБУУБ, Ч ЛБЦДПК ЮБУФЙ РТПЗТБННЩ, ЛПНРЙМЙТХЕНПК ПФДЕМШОП, ДПМЦОП ПФОПУЙФШУС Л ПДОПНХ Й ФПНХ ЦЕ ФЙРХ, ЪОБЮЕОЙА, ЖХОЛГЙЙ ЙМЙ ПВЯЕЛФХ. фП ЕУФШ, Ч РТПЗТБННЕ НПЦЕФ ВЩФШ ФПМШЛП ПДЙО ОЕМПЛБМШОЩК ФЙР, ЪОБЮЕОЙЕ, ЖХОЛГЙС ЙМЙ ПВЯЕЛФ У ЬФЙН ЙНЕОЕН. тБУУНПФТЙН, ОБРТЙНЕТ, ДЧБ ЖБКМБ: // file1.c: int a = 1; int f() { /* ЮФП-ФП ДЕМБЕФ */ } // file2.c: extern int a; int f(); void g() { a = f(); }

a Й f(), ЙУРПМШЪХЕНЩЕ g() Ч ЖБКМЕ file2.c,- ФЕ ЦЕ, ЮФП ПРТЕДЕМЕОЩ Ч ЖБКМЕ file1.c. лМАЮЕЧПЕ УМПЧП extern (ЧОЕЫОЕЕ) ХЛБЪЩЧБЕФ, ЮФП ПРЙУБОЙЕ a Ч file2.c СЧМСЕФУС (ФПМШЛП) ПРЙУБОЙЕН, Б ОЕ ПРТЕДЕМЕОЙЕН. еУМЙ ВЩ a ЙОЙГЙБМЙЪЙТПЧБМПУШ, extern ВЩМП ВЩ РТПУФП РТПЙЗОПТЙТПЧБОП, РПУЛПМШЛХ ПРЙУБОЙЕ У ЙОЙГЙБМЙЪБГЙЕК ЧУЕЗДБ СЧМСЕФУС ПРТЕДЕМЕОЙЕН. пВЯЕЛФ Ч РТПЗТБННЕ ДПМЦЕО ПРТЕДЕМСФШУС ФПМШЛП ПДЙО ТБЪ. пРЙУЩЧБФШУС ПО НПЦЕФ НОПЗП ТБЪ, ОП ФЙРЩ ДПМЦОЩ ФПЮОП УПЗМБУПЧЩЧБФШУС. оБРТЙНЕТ: // file1.c: int a = 1; int b = 1; extern int c; // file2.c: int a; extern double b; extern int c;

ъДЕУШ ФТЙ ПЫЙВЛЙ: a ПРТЕДЕМЕОП ДЧБЦДЩ (int a; СЧМСЕФУС ПРТЕДЕМЕОЙЕН, ЛПФПТПЕ ПЪОБЮБЕФ int a=0;), b ПРЙУБОП ДЧБЦДЩ У ТБЪОЩНЙ ФЙРБНЙ, Б c ПРЙУБОП ДЧБЦДЩ, ОП ОЕ ПРТЕДЕМЕОП. ьФЙ ЧЙДЩ ПЫЙВПЛ (ПЫЙВЛЙ ЛПНРПОПЧЛЙ) ОЕ НПЗХФ ВЩФШ ПВОБТХЦЕОЩ ЛПНРЙМСФПТПН, ЛПФПТЩК ЪБ ПДЙО ТБЪ ЧЙДЙФ ФПМШЛП ПДЙО ЖБКМ. лПНРПОПЧЭЙЛ, ПДОБЛП, ЙИ ПВОБТХЦЙЧБЕФ.

уМЕДХАЭБС РТПЗТБННБ ОЕ СЧМСЕФУС C++ РТПЗТБННПК (ИПФС C РТПЗТБННПК СЧМСЕФУС): // file1.c: int a; int f() { return a; } // file2.c: int a; int g() { return f(); }

чП-РЕТЧЩИ, file2.c ОЕ C++, РПФПНХ ЮФП f() ОЕ ВЩМБ ПРЙУБОБ, Й РПЬФПНХ ЛПНРЙМСФПТ ВХДЕФ ОЕДПЧПМЕО. чП-ЧФПТЩИ, (ЛПЗДБ file2.c ЖЙЛУЙТПЧБО) РТПЗТБННБ ОЕ ВХДЕФ УЛПНРПОПЧБОБ, РПУЛПМШЛХ a ПРТЕДЕМЕОП ДЧБЦДЩ.

йНС НПЦОП УДЕМБФШ МПЛБМШОЩН Ч ЖБКМЕ, ПРЙУБЧ ЕЗП static. оБРТЙНЕТ: // file1.c: static int a = 6; static int f() { /* ... */ } // file2.c: static int a = 7; static int f() { /* ... */ }

рПУЛПМШЛХ ЛБЦДПЕ a Й f ПРЙУБОП ЛБЛ static, РПМХЮБАЭБСУС Ч ТЕЪХМШФБФЕ РТПЗТБННБ СЧМСЕФУС РТБЧЙМШОПК. ч ЛБЦДПН ЖБКМЕ УЧПС a Й УЧПС f().

лПЗДБ РЕТЕНЕООЩЕ Й ЖХОЛГЙЙ СЧОП ПРЙУБОЩ ЛБЛ static, ЮБУФШ РТПЗТБННЩ МЕЗЮЕ РПОСФШ (ЧБН ОЕ ОБДП ОЙЛХДБ ВПМШЫЕ ЪБЗМСДЩЧБФШ). йУРПМШЪПЧБОЙЕ static ДМС ЖХОЛГЙК НПЦЕФ, РПНЙНП ЬФПЗП, ЧЩЗПДОП ЧМЙСФШ ОБ ТБУИПДЩ РП ЧЩЪПЧХ ЖХОЛГЙЙ, РПУЛПМШЛХ ДБЕФ ПРФЙНЙЪЙТХАЭЕНХ ЛПНРЙМСФПТХ ВПМЕЕ РТПУФХА ТБВПФХ.

тБУУНПФТЙН ДЧБ ЖБКМБ: // file1.c: const int a = 6; inline int f() { /* ... */ } struct s { int a,b; } // file1.c: const int a = 7; inline int f() { /* ... */ } struct s { int a,b; }

тБЪ РТБЧЙМП "ТПЧОП ПДОП ПРТЕДЕМЕОЙЕ" РТЙНЕОСЕФУС Л ЛПОУФБОФБН, inline-ЖХОЛГЙСН Й ПРТЕДЕМЕОЙСН ЖХОЛГЙК ФБЛ ЦЕ, ЛБЛ ПОП РТЙНЕОСЕФУС Л ЖХОЛГЙСН Й РЕТЕНЕООЩН, ФП file1.c Й file2.c ОЕ НПЗХФ ВЩФШ ЮБУФСНЙ ПДОПК C++ РТПЗТБННЩ. оП ЕУМЙ ЬФП ФБЛ, ФП ЛБЛ ЦЕ ДЧБ ЖБКМБ НПЗХФ ЙУРПМШЪПЧБФШ ПДОЙ Й ФЕ ЦЕ ФЙРЩ Й ЛПОУФБОФЩ? лПТПФЛП, ПФЧЕФ ФБЛПЧ: ФЙРЩ, ЛПОУФБОФЩ Й Ф.Р. НПЗХФ ПРТЕДЕМСФШУС УФПМШЛП ТБЪ, УЛПМШЛП ОХЦОП, РТЙ ХУМПЧЙЙ, ЮФП ПОЙ ПРТЕДЕМСАФУС ПДЙОБЛПЧП. рПМОЩК ПФЧЕФ ОЕУЛПМШЛП ВПМЕЕ УМПЦЕО (ЬФП ПВЯСУОСЕФУС Ч УМЕДХАЭЕН ТБЪДЕМЕ). 4.3 ъБЗПМПЧПЮОЩЕ жБКМЩ 4.3.1 пДЙО ъБЗПМПЧПЮОЩК жБКМ 4.3.2 нОПЦЕУФЧЕООЩЕ ъБЗПМПЧПЮОЩЕ жБКМЩ 4.3.3 уЛТЩФЙЕ дБООЩИ фЙРЩ ЧП ЧУЕИ ПРЙУБОЙСИ ПДОПЗП Й ФПЗП ЦЕ ПВЯЕЛФБ ДПМЦОЩ ВЩФШ УПЗМБУПЧБООЩНЙ. пДЙО ЙЪ УРПУПВПЧ ЬФП ДПУФЙЮШ НПЗ ВЩ УПУФПСФШ Ч ПВЕУРЕЮЕОЙЙ УТЕДУФЧ РТПЧЕТЛЙ ФЙРПЧ Ч ЛПНРПОПЧЭЙЛЕ, ОП ВПМШЫЙОУФЧП ЛПНРПОПЧЭЙЛПЧ - ПВТБЪГБ 1950-И, Й ЙИ ОЕМШЪС ЙЪНЕОЙФШ РП РТБЛФЙЮЕУЛЙН УППВТБЦЕОЙСН *3. дТХЗПК РПДИПД УПУФПЙФ Ч ПВЕУРЕЮЕОЙЙ ФПЗП, ЮФП ЙУИПДОЩК ФЕЛУФ, ЛБЛ ПО РЕТЕДБЕФУС ОБ ТБУУНПФТЕОЙЕ ЛПНРЙМСФПТХ, ЙМЙ УПЗМБУПЧБО, ЙМЙ УПДЕТЦЙФ ЙОЖПТНБГЙА, ЛПФПТБС РПЪЧПМСЕФ ЛПНРЙМСФПТХ ПВОБТХЦЙФШ ОЕУПЗМБУПЧБООПУФЙ. пДЙО ОЕУПЧЕТЫЕООЩК, ОП РТПУФПК УРПУПВ ДПУФЙЮШ УПЗМБУПЧБООПУФЙ УПУФПЙФ ЧП ЧЛМАЮЕОЙЙ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ, УПДЕТЦБЭЙИ ЙОФЕТЖЕКУОХА ЙОЖПТНБГЙА, Ч ЙУИПДОЩЕ ЖБКМЩ, Ч ЛПФПТЩИ УПДЕТЦЙФУС ЙУРПМОСЕНЩК ЛПД Й/ЙМЙ ПРТЕДЕМЕОЙС ДБООЩИ.

нЕИБОЙЪН ЧЛМАЮЕОЙС У РПНПЭША #include - ЬФП ЮТЕЪЧЩЮБКОП РТПУФПЕ УТЕДУФЧП ПВТБВПФЛЙ ФЕЛУФБ ДМС УВПТЛЙ ЛХУЛПЧ ЙУИПДОПК РТПЗТБННЩ Ч ПДОХ ЕДЙОЙГХ (ЖБКМ) ДМС ЕЕ ЛПНРЙМСГЙЙ. дЙТЕЛФЙЧБ #include "to_be_included"

ЪБНЕЭБЕФ УФТПЛХ, Ч ЛПФПТПК ЧУФТЕФЙМПУШ #include, УПДЕТЦЙНЩН ЖБКМБ "to_be_included". еЗП УПДЕТЦЙНЩН ДПМЦЕО ВЩФШ ЙУИПДОЩК ФЕЛУФ ОБ C++, РПУЛПМШЛХ ДБМШЫЕ ЕЗП ВХДЕФ ЮЙФБФШ ЛПНРЙМСФПТ. юБУФП ЧЛМАЮЕОЙЕ ПВТБВБФЩЧБЕФУС ПФДЕМШОПК РТПЗТБННПК, ОБЪЩЧБЕНПК C РТЕРТПГЕУУПТПН, ЛПФПТХА CC ЧЩЪЩЧБЕФ ДМС РТЕПВТБЪПЧБОЙС ЙУИПДОПЗП ЖБКМБ, ЛПФПТЩК ДБМ РТПЗТБННЙУФ, Ч ЖБКМ ВЕЪ ДЙТЕЛФЙЧ ЧЛМАЮЕОЙС РЕТЕД ФЕН, ЛБЛ ОБЮБФШ УПВУФЧЕООП ЛПНРЙМСГЙА. ч ДТХЗПН ЧБТЙБОФЕ ЬФЙ ДЙТЕЛФЙЧЩ ПВТБВБФЩЧБЕФ ЙОФЕТЖЕКУОБС УЙУФЕНБ ЛПНРЙМСФПТБ РП НЕТЕ ФПЗП, ЛБЛ ПОЙ ЧУФТЕЮБАФУС Ч ЙУИПДОПН ФЕЛУФЕ. еУМЙ РТПЗТБННЙУФ ИПЮЕФ РПУНПФТЕФШ ОБ ТЕЪХМШФБФ ДЙТЕЛФЙЧ ЧЛМАЮЕОЙС, НПЦОП ЧПУРПМШЪПЧБФШУС ЛПНБОДПК CC -E file.c

ДМС РТЕРТПГЕУУЙТПЧБОЙС ЖБКМБ file.c ФПЮОП ФБЛЦЕ, ЛБЛ ЬФП УДЕМБМБ ВЩ CC РЕТЕД ЪБРХУЛПН УПВУФЧЕООП ЛПНРЙМСФПТБ. дМС ЧЛМАЮЕОЙС ЖБКМПЧ ЙЪ УФБОДБТФОПК ДЙТЕЛФПТЙЙ ЧЛМАЮЕОЙС ЧНЕУФП ЛБЧЩЮЕЛ ЙУРПМШЪХАФУС ХЗМПЧЩЕ УЛПВЛЙ < Й >. оБРТЙНЕТ: #include // ЙЪ УФБОДБТФОПК ДЙТЕЛФПТЙЙ ЧЛМАЮЕОЙС #define "myheader.h" // ЙЪ ФЕЛХЭЕК ДЙТЕЛФПТЙЙ

йУРПМШЪПЧБОЙЕ ЙНЕЕФ ФП РТЕЙНХЭЕУФЧП, ЮФП Ч РТПЗТБННХ ЖБЛФЙЮЕУЛПЕ ЙНС ДЙТЕЛФПТЙЙ ЧЛМАЮЕОЙС ОЕ ЧУФТБЙЧБЕФУС (ЛБЛ РТБЧЙМП, УОБЮБМБ РТПУНБФТЙЧБЕФУС /usr/include/CC, Б РПФПН usr/include). л УПЦБМЕОЙА, РТПВЕМЩ Ч ДЙТЕЛФЙЧЕ include УХЭЕУФЧЕООЩ: #include < stream.h > // ОЕ ОБКДЕФ

нПЦЕФ РПЛБЪБФШУС, ЮФП РЕТЕЛПНРЙМЙТПЧБФШ ЖБКМ ЪБОПЧП ЛБЦДЩК ТБЪ, ЛПЗДБ ПО ЛХДБ-МЙВП ЧЛМАЮБЕФУС, ТБУФПЮЙФЕМШОП, ОП ЧТЕНС ЛПНРЙМСГЙЙ ФБЛПЗП ЖБКМБ ПВЩЮОП УМБВП ПФМЙЮБЕФУС ПФ ЧТЕНЕОЙ, ЛПФПТПЕ ОЕПВИПДЙНП ДМС ЮФЕОЙС ЕЗП ОЕЛПФПТПК ЪБТБОЕЕ ПФЛПНРЙМЙТПЧБООПК ЖПТНЩ. рТЙЮЙОБ Ч ФПН, ЮФП ФЕЛУФ РТПЗТБННЩ СЧМСЕФУС ДПЧПМШОП ЛПНРБЛФОЩН РТЕДУФБЧМЕОЙЕН РТПЗТБННЩ, Й Ч ФПН, ЮФП ЧЛМАЮБЕНЩЕ ЖБКМЩ ПВЩЮОП УПДЕТЦБФ ФПМШЛП ПРЙУБОЙС Й ОЕ УПДЕТЦБФ РТПЗТБНН, ФТЕВХАЭЙИ ПФ ЛПНРЙМСФПТБ ЪОБЮЙФЕМШОПЗП БОБМЙЪБ.

уМЕДХАЭЕЕ ЬНРЙТЙЮЕУЛПЕ РТБЧЙМП ПФОПУЙФЕМШОП ФПЗП, ЮФП УМЕДХЕФ, Б ЮФП ОЕ УМЕДХЕФ РПНЕЭБФШ Ч ЪБЗПМПЧПЮОЩЕ ЖБКМЩ, СЧМСЕФУС ОЕ ФТЕВПЧБОЙЕН СЪЩЛБ, Б РТПУФП РТЕДМПЦЕОЙЕН РП ТБЪХНОПНХ ЙУРПМШЪПЧБОЙА БРРБТБФБ #include.

ч ЪБЗПМПЧПЮОПН ЖБКМЕ НПЗХФ УПДЕТЦБФШУС: пРТЕДЕМЕОЙС ФЙРПЧ struct point { int x, y; } пРЙУБОЙС ЖХОЛГЙК extern int strlen(const char*); пРТЕДЕМЕОЙС inline-ЖХОЛГЙК inline char get() { return *p++; } пРЙУБОЙС ДБООЩИ extern int a; пРТЕДЕМЕОЙС ЛПОУФБОФ const float pi = 3.141593 рЕТЕЮЙУМЕОЙС enum bool { false, true }; дЙТЕЛФЙЧЩ include #include пРТЕДЕМЕОЙС НБЛТПУПЧ #define Case break;case лПННЕОФБТЙЙ /* РТПЧЕТЛБ ОБ ЛПОЕГ ЖБКМБ */

ОП ОЙЛПЗДБ пРТЕДЕМЕОЙС ПВЩЮОЩИ ЖХОЛГЙК char get() { return *p++; } пРТЕДЕМЕОЙС ДБООЩИ int a; пРТЕДЕМЕОЙС УМПЦОЩИ ЛПОУФБОФОЩИ ПВЯЕЛФПЧ const tbl[] = { /* ... */ }

ч УЙУФЕНЕ UNIX РТЙОСФП, ЮФП ЪБЗПМПЧПЮОЩЕ ЖБКМЩ ЙНЕАФ УХЖЖЙЛУ (ТБУЫЙТЕОЙЕ) .h. жБКМЩ, УПДЕТЦБЭЙЕ ПРТЕДЕМЕОЙЕ ДБООЩИ ЙМЙ ЖХОЛГЙК, ДПМЦОЩ ЙНЕФШ УХЖЖЙЛУ .c. фБЛЙЕ ЖБКМЩ ЮБУФП ОБЪЩЧБАФ, УППФЧЕФУФЧЕООП, ".h ЖБКМЩ" Й ".c ЖБКМЩ". ч #4.7 ПРЙУЩЧБАФУС НБЛТПУЩ. уМЕДХЕФ ЪБНЕФЙФШ, ЮФП Ч C++ НБЛТПУЩ ЗПТБЪДП НЕОЕЕ РПМЕЪОЩ, ЮЕН Ч C, РПУЛПМШЛХ C++ ЙНЕЕФ ФБЛЙЕ СЪЩЛПЧЩЕ ЛПОУФТХЛГЙЙ, ЛБЛ const ДМС ПРТЕДЕМЕОЙС ЛПОУФБОФ Й inline ДМС ЙУЛМАЮЕОЙС ТБУИПДПЧ ОБ ЧЩЪПЧ ЖХОЛГЙЙ.

рТЙЮЙОБ ФПЗП, РПЮЕНХ Ч ЪБЗПМПЧПЮОЩИ ЖБКМБИ ДПРХУЛБЕФУС ПРТЕДЕМЕОЙЕ РТПУФЩИ ЛПОУФБОФ, ОП ОЕ ДПРХУЛБЕФУС ПРТЕДЕМЕОЙЕ УМПЦОЩИ ЛПОУФБОФОЩИ ПВЯЕЛФПЧ, РТБЗНБФЙЮЕУЛБС. ч РТЙОГЙРЕ, УМПЦОПУФШ ФХФ ФПМШЛП Ч ФПН, ЮФПВЩ УДЕМБФШ ДПРХУФЙНЩН ДХВМЙТПЧБОЙЕ ПРТЕДЕМЕОЙК РЕТЕНЕООЩИ (ДБЦЕ ПРТЕДЕМЕОЙС ЖХОЛГЙК НПЦОП ВЩМП ВЩ ДХВМЙТПЧБФШ). пДОБЛП ДМС ЛПНРПОПЧЭЙЛПЧ УФБТПЗП ПВТБЪГБ УМЙЫЛПН ФТХДОП РТПЧЕТСФШ ФПЦДЕУФЧЕООПУФШ ОЕФТЙЧЙБМШОЩИ ЛПОУФБОФ Й ХВЙТБФШ ОЕОХЦОЩЕ РПЧФПТЩ. лТПНЕ ФПЗП, РТПУФЩЕ УМХЮБЙ ЗПТБЪДП ВПМЕЕ ПВЙИПДОЩ Й РПФПНХ ВПМЕЕ ЧБЦОЩ ДМС ЗЕОЕТБГЙЙ ИПТПЫЕЗП ЛПДБ. 4.3.1 пДЙО ъБЗПМПЧПЮОЩК жБКМ рТПЭЕ ЧУЕЗП ТЕЫЙФШ РТПВМЕНХ ТБЪВЙЕОЙС РТПЗТБННЩ ОБ ОЕУЛПМШЛП ЖБКМПЧ РПНЕУФЙЧ ЖХОЛГЙЙ Й ПРТЕДЕМЕОЙС ДБООЩИ Ч РПДИПДСЭЕЕ ЮЙУМП ЙУИПДОЩИ ЖБКМПЧ Й ПРЙУБЧ ФЙРЩ, ОЕПВИПДЙНЩЕ ДМС ЙИ ЧЪБЙНПДЕКУФЧЙС, Ч ПДОПН ЪБЗПМПЧПЮОПН ЖБКМЕ, ЛПФПТЩК ЧЛМАЮБЕФУС ЧП ЧУЕ ПУФБМШОЩЕ ЖБКМЩ. дМС РТПЗТБННЩ ЛБМШЛХМСФПТБ НПЦОП ЙУРПМШЪПЧБФШ ЮЕФЩТЕ .c ЖБКМБ: lex.c, syn.c, table.c Й main.c, Й ЪБЗПМПЧПЮОЩК ЖБКМ dc.h, УПДЕТЦБЭЙК ПРЙУБОЙС ЧУЕИ ЙНЕО, ЛПФПТЩЕ ЙУРПМШЪХАФУС ВПМЕЕ ЮЕН Ч ПДОПН .c ЖБКМЕ: // dc.h: ПВЭЙЕ ПРЙУБОЙС ДМС ЛБМШЛХМСФПТБ enum token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; extern int no_of_errors; extern double error(char* s); extern token_value get_token(); extern token_value curr_tok; extern double number_value; extern char name_string[256]; extern double expr(); extern double term(); extern double prim(); struct name { char* string; name* next; double value; }; extern name* look(char* p, int ins = 0); inline name* insert(char* s) { return look(s,1); }

еУМЙ ПРХУФЙФШ ЖБЛФЙЮЕУЛЙК ЛПД, ФП lex.c ВХДЕФ ЧЩЗМСДЕФШ РТЙНЕТОП ФБЛ: // lex.c: ЧЧПД Й МЕЛУЙЮЕУЛЙК БОБМЙЪ #include "dc.h" #include token_value curr_tok; double number_value; char name_string[256]; token_value get_token() { /* ... */ }

ъБНЕФШФЕ, ЮФП ФБЛПЕ ЙУРПМШЪПЧБОЙЕ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ ЗБТБОФЙТХЕФ, ЮФП ЛБЦДПЕ ПРЙУБОЙЕ Ч ЪБЗПМПЧПЮОПН ЖБКМЕ ПВЯЕЛФБ, ПРТЕДЕМЕООПЗП РПМШЪПЧБФЕМЕН, ВХДЕФ Ч ЛБЛПК-ФП НПНЕОФ ЧЛМАЮЕОП Ч ЖБКМ, ЗДЕ ПО ПРТЕДЕМСЕФУС. оБРТЙНЕТ, РТЙ ЛПНРЙМСГЙЙ lex.c ЛПНРЙМСФПТХ ВХДЕФ РЕТЕДБОП: extern token_value get_token(); // ... token_value get_token() { /* ... */ }

ьФП ПВЕУРЕЮЙЧБЕФ ФП, ЮФП ЛПНРЙМСФПТ ПВОБТХЦЙФ МАВХА ОЕУПЗМБУПЧБООПУФШ Ч ФЙРБИ, ХЛБЪБООЩИ ДМС ЙНЕОЙ. оБРТЙНЕТ, ЕУМЙ ВЩ get_token() ВЩМБ ПРЙУБОБ ЛБЛ ЧПЪЧТБЭБАЭБС token_value, ОП РТЙ ЬФПН ПРТЕДЕМЕОБ ЛБЛ ЧПЪЧТБЭБАЭБС int, ЛПНРЙМСГЙС lex.c ОЕ РТПЫМБ ВЩ ЙЪ- ЪБ ПЫЙВЛЙ ОЕУППФЧЕФУФЧЙС ФЙРПЧ.

жБКМ syn.c ВХДЕФ ЧЩЗМСДЕФШ РТЙНЕТОП ФБЛ: // syn.c: УЙОФБЛУЙЮЕУЛЙК БОБМЙЪ Й ЧЩЮЙУМЕОЙЕ #include "dc.h" double prim() { /* ... */ } double term() { /* ... */ } double expr() { /* ... */ }

жБКМ table.c ВХДЕФ ЧЩЗМСДЕФШ РТЙНЕТОП ФБЛ: // table.c: ФБВМЙГБ ЙНЕО Й РТПУНПФТ #include "dc.h" extern char* strcmp(const char*, const char*); extern char* strcpy(char*, const char*); extern int strlen(const char*); const TBLSZ = 23; name* table[TBLSZ]; name* look(char* p; int ins) { /* ... */ }

ъБНЕФШФЕ, ЮФП table.c УБН ПРЙУЩЧБЕФ УФБОДБТФОЩЕ ЖХОЛГЙЙ ДМС ТБВПФЩ УП УФТПЛБНЙ, РПЬФПНХ ОЙЛБЛПК РТПЧЕТЛЙ УПЗМБУПЧБООПУФЙ ЬФЙИ ПРЙУБОЙК ОЕФ. рПЮФЙ ЧУЕЗДБ МХЮЫЕ ЧЛМАЮБФШ ЪБЗПМПЧПЮОЩК ЖБКМ, ЮЕН ПРЙУЩЧБФШ ЙНС Ч .c ЖБКМЕ ЛБЛ extern. рТЙ ЬФПН НПЦЕФ ЧЛМАЮБФШУС "УМЙЫЛПН НОПЗП", ОП ЬФП ПВЩЮОП ОЕ ПЛБЪЩЧБЕФ УЕТШЕЪОПЗП ЧМЙСОЙС ОБ ЧТЕНС, ОЕПВИПДЙНПЕ ДМС ЛПНРЙМСГЙЙ, Й ЛБЛ РТБЧЙМП ЬЛПОПНЙФ ЧТЕНС РТПЗТБННЙУФБ. ч ЛБЮЕУФЧЕ РТЙНЕТБ ЬФПЗП, ПВТБФЙФЕ ЧОЙНБОЙЕ ОБ ФП, ЛБЛ strlen() ЪБОПЧП ПРЙУЩЧБЕФУС Ч main() (ОЙЦЕ). ьФП МЙЫОЙЕ ОБЦБФЙС ЛМБЧЙЫ Й ЧПЪНПЦОЩК ЙУФПЮОЙЛ ОЕРТЙСФОПУФЕК, РПУЛПМШЛХ ЛПНРЙМСФПТ ОЕ НПЦЕФ РТПЧЕТЙФШ УПЗМБУПЧБООПУФШ ЬФЙИ ДЧХИ ПРТЕДЕМЕОЙК. оБ УБНПН ДЕМЕ, ЬФПК УМПЦОПУФЙ НПЦОП ВЩМП ВЩ ЙЪВЕЦБФШ, ВХДШ ЧУЕ ПРЙУБОЙС extern РПНЕЭЕОЩ Ч dc.h, ЛБЛ Й РТЕДМБЗБМПУШ УДЕМБФШ. ьФБ "ОЕВТЕЦОПУФШ" УПИТБОЕОБ Ч РТПЗТБННЕ, РПУЛПМШЛХ ЬФП ПЮЕОШ ФЙРЙЮОП ДМС C РТПЗТБНН, ПЮЕОШ УПВМБЪОЙФЕМШОП ДМС РТПЗТБННЙУФБ, Й ЮБЭЕ РТЙЧПДЙФ, ЮЕН ОЕ РТЙЧПДЙФ, Л ПЫЙВЛБН, ЛПФПТЩЕ ФТХДОП ПВОБТХЦЙФШ, Й Л РТПЗТБННБН, У ЛПФПТЩНЙ ФСЦЕМП ТБВПФБФШ. чБУ РТЕДХРТЕДЙМЙ!

й main.c, ОБЛПОЕГ, ЧЩЗМСДЙФ ФБЛ: // main.c: ЙОЙГЙБМЙЪБГЙС, ЗМБЧОЩК ГЙЛМ Й ПВТБВПФЛБ ПЫЙВПЛ #include "dc.h" int no_of_errors; double error(char* s) { /* ... */ } extern int strlen(const char*); main(int argc, char* argv[]) { /* ... */ }

чБЦОЩК УМХЮБК, ЛПЗДБ ТБЪНЕТ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ УФБОПЧЙФУС УЕТШЕЪОПК РПНЕИПК. оБВПТ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ Й ВЙВМЙПФЕЛХ НПЦОП ЙУРПМШЪПЧБФШ ДМС ТБУЫЙТЕОЙС СЪЩЛБ НОПЦЕУФЧПН ПВЭЕ- Й УРЕГЙБМШОП- РТЙЛМБДОЩИ ФЙРПЧ (УН. зМБЧЩ 5-8). ч ФБЛЙИ УМХЮБСИ ОЕ РТЙОСФП ПУХЭЕУФЧМСФШ ЮФЕОЙЕ ФЩУСЮ УФТПЛ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ Ч ОБЮБМЕ ЛБЦДПК ЛПНРЙМСГЙЙ. уПДЕТЦБОЙЕ ЬФЙИ ЖБКМПЧ ПВЩЮОП "ЪБНПТПЦЕОП" Й ЙЪНЕОСЕФУС ПЮЕОШ ОЕЮБУФП. оБЙВПМЕЕ РПМЕЪОЩН НПЦЕФ ПЛБЪБФШУС НЕФПД ЪБФТБЧЛЙ ЛПНРЙМСФПТБ УПДЕТЦБОЙЕН ЬФЙИ ЪБЗПМПЧПЮОЩИ ЖБМПЧ. рП УХФЙ, УПЪДБЕФУС СЪЩЛ УРЕГЙБМШОПЗП ОБЪОБЮЕОЙС УП УЧПЙН УПВУФЧЕООЩН ЛПНРЙМСФПТПН. оЙЛБЛПЗП УФБОДБТФОПЗП НЕФПДБ УПЪДБОЙС ФБЛПЗП ЛПНРЙМСФПТБ У ЪБФТБЧЛПК ОЕ РТЙОСФП. 4.3.2 нОПЦЕУФЧЕООЩЕ ъБЗПМПЧПЮОЩЕ жБКМЩ уФЙМШ ТБЪВЙЕОЙС РТПЗТБННЩ У ПДОЙН ЪБЗПМПЧПЮОЩН ЖБКМПН ОБЙВПМЕЕ РТЙЗПДЕО Ч ФЕИ УМХЮБСИ, ЛПЗДБ РТПЗТБННБ ОЕЧЕМЙЛБ Й ЕЕ ЮБУФЙ ОЕ РТЕДРПМБЗБЕФУС ЙУРПМШЪПЧБФШ ПФДЕМШОП. рПЬФПНХ ФП, ЮФП ОЕЧПЪНПЦОП ХУФБОПЧЙФШ, ЛБЛЙЕ ПРЙУБОЙС ЪБЮЕН РПНЕЭЕОЩ Ч ЪБЗПМПЧПЮОЩК ЖБКМ, ОЕУХЭЕУФЧЕООП. рПНПЮШ НПЗХФ ЛПННЕОФБТЙЙ. дТХЗПК УРПУПВ - УДЕМБФШ ФБЛ, ЮФПВЩ ЛБЦДБС ЮБУФШ РТПЗТБННЩ ЙНЕМБ УЧПК ЪБЗПМПЧПЮОЩК ЖБКМ, Ч ЛПФПТПН ПРТЕДЕМСАФУС РТЕДПУФБЧМСЕНЩЕ ЬФПК ЮБУФША УТЕДУФЧБ. фПЗДБ ЛБЦДЩК .c ЖБКМ ЙНЕЕФ УППФЧЕФУФЧХАЭЙК .h ЖБКМ, Й ЛБЦДЩК .c ЖБКМ ЧЛМАЮБЕФ УЧПК УПВУФЧЕООЩК (УРЕГЙЖЙГЙТХАЭЙК ФП, ЮФП Ч ОЕН ЪБДБЕФУС) .h ЖБКМ Й, ЧПЪНПЦОП, ОЕЛПФПТЩЕ ДТХЗЙЕ .h ЖБКМЩ (УРЕГЙЖЙГЙТХАЭЙЕ ФП, ЮФП ЕНХ ОХЦОП).

тБУУНБФТЙЧБС ПТЗБОЙЪБГЙА ЛБМШЛХМСФПТБ, НЩ ЪБНЕЮБЕН, ЮФП error() ЙУРПМШЪХЕФУС РПЮФЙ ЛБЦДПК ЖХОЛГЙЕК РТПЗТБННЩ, Б УБНБ ЙУРПМШЪХЕФ ФПМШЛП . ьФП ПВЩЮОБС ДМС ЖХОЛГЙЙ ПЫЙВПЛ УЙФХБГЙС, РПЬФПНХ error() УМЕДХЕФ ПФДЕМЙФШ ПФ main(): // error.h: ПВТБВПФЛБ ПЫЙВПЛ extern int no_errors; extern double error(char* s); // error.c #include #include "error.h" int no_of_errors; double error(char* s) { /* ... */ }

рТЙ ФБЛПН УФЙМЕ ЙУРПМШЪПЧБОЙС ЪБЗПМПЧПЮОЩИ ЖБКМПЧ .h ЖБКМ Й УЧСЪБООЩК У ОЙН .c ЖБКМ НПЦОП ТБУУНБФТЙЧБФШ ЛБЛ НПДХМШ, Ч ЛПФПТПН .h ЖБКМ ЪБДБЕФ ЙОФЕТЖЕКУ, Б .c ЖБКМ ЪБДБЕФ ТЕБМЙЪБГЙА.

фБВМЙГБ УЙНЧПМПЧ ОЕ ЪБЧЙУЙФ ПФ ПУФБМШОПК ЮБУФЙ ЛБМШЛХМСФПТБ ЪБ ЙУЛМАЮЕОЙЕН ЙУРПМШЪПЧБОЙС ЖХОЛГЙЙ ПЫЙВПЛ. ьФП НПЦОП УДЕМБФШ СЧОЩН: // table.h: ПРЙУБОЙС ФБВМЙГЩ ЙНЕО struct name { char* string; name* next; double value; }; extern name* look(char* p, int ins = 0); inline name* insert(char* s) { return look(s,1); } // table.c: ПРТЕДЕМЕОЙС ФБВМЙГЩ ЙНЕО #include "error.h" #include #include "table.h" const TBLSZ = 23; name* table[TBLSZ]; name* look(char* p; int ins) { /* ... */ }

ъБНЕФШФЕ, ЮФП ПРЙУБОЙС ЖХОЛГЙК ТБВПФЩ УП УФТПЛБНЙ ФЕРЕТШ ЧЛМАЮБАФУС ЙЪ . ьФП ЙУЛМАЮБЕФ ЕЭЕ ПДЙО ЧПЪНПЦОЩК ЙУФПЮОЙЛ ПЫЙВПЛ. // lex.h: ПРЙУБОЙС ДМС ЧЧПДБ Й МЕЛУЙЮЕУЛПЗП БОБМЙЪБ enum token_value { NAME, NUMBER, END, PLUS='+', MINUS='-', MUL='*', DIV='/', PRINT=';', ASSIGN='=', LP='(', RP=')' }; extern token_value curr_tok; extern double number_value; extern char name_string[256]; extern token_value get_token();

ьФПФ ЙОФЕТЖЕКУ МЕЛУЙЮЕУЛПЗП БОБМЙЪБФПТБ ДПУФБФПЮОП ВЕУРПТСДПЮЕО. оЕДПУФБФПЛ Ч ОБДМЕЦБЭЕН ФЙРЕ МЕЛУЕНЩ ПВОБТХЦЙЧБЕФ УЕВС Ч ОЕПВИПДЙНПУФЙ ДБЧБФШ РПМШЪПЧБФЕМА get_token() ЖБЛФЙЮЕУЛЙЕ МЕЛУЙЮЕУЛЙЕ ВХЖЕТЩ number_value Й name_string. // lex.c: ПРТЕДЕМЕОЙС ДМС ЧЧПДБ Й МЕЛУЙЮЕУЛПЗП БОБМЙЪБ #include #include #include "error.h" #include "lex.h" token_value curr_tok; double number_value; char name_string[256]; token_value get_token() { /* ... */ }

йОФЕТЖЕКУ УЙОФБЛУЙЮЕУЛПЗП БОБМЙЪБФПТБ УПЧЕТЫЕООП РТПЪТБЮЕО: // syn.c: ПРЙУБОЙС ДМС УЙОФБЛУЙЮЕУЛПЗП БОБМЙЪБ Й ЧЩЮЙУМЕОЙС extern double expr(); extern double term(); extern double prim(); // syn.c: ПРТЕДЕМЕОЙС ДМС УЙОФБЛУЙЮЕУЛПЗП БОБМЙЪБ Й ЧЩЮЙУМЕОЙС #include "error.h" #include "lex.h" #include "syn.h" double prim() { /* ... */ } double term() { /* ... */ } double expr() { /* ... */ }

зМБЧОБС РТПЗТБННБ, ЛБЛ ЧУЕЗДБ, ФТЙЧЙБМШОБ: // main.c: ЗМБЧОБС РТПЗТБННБ #include #include "error.h" #include "lex.h" #include "syn.h" #include "table.h" #include main(int argc, char* argv[]) { /* ... */ }

уЛПМШЛП ЪБЗПМПЧПЮОЩИ ЖБКМПЧ ЙУРПМШЪПЧБФШ Ч РТПЗТБННЕ, ЪБЧЙУЙФ ПФ НОПЗЙИ ЖБЛФПТПЧ. нОПЗЙЕ ЙЪ ЬФЙИ ЖБЛФПТПЧ УЙМШОЕЕ УЧСЪБОЩ У ФЕН, ЛБЛ ЧБЫБ УЙУФЕНБ ТБВПФБЕФ У ЪБЗПМПЧПЮОЩНЙ ЖБКМБНЙ, ОЕЦЕМЙ У C++. оБРТЙНЕТ, ЕУМЙ Ч ЧБЫЕН ТЕДБЛФПТЕ ОЕФ УТЕДУФЧ, РПЪЧПМСАЭЙИ ПДОПЧТЕНЕООП ЧЙДЕФШ ОЕУЛПМШЛП ЖБКМПЧ, ЙУРПМШЪПЧБОЙЕ ВПМШЫПЗП ЮЙУМБ ЖБКМПЧ УФБОПЧЙФУС НЕОЕЕ РТЙЧМЕЛБФЕМШОЩН. бОБМПЗЙЮОП, ЕУМЙ ПФЛТЩЧБОЙЕ Й ЮФЕОЙЕ 10 ЖБКМПЧ РП 50 УФТПЛ Ч ЛБЦДПН ФТЕВХЕФ ЪБНЕФОП ВПМШЫЕ ЧТЕНЕОЙ, ЮЕН ЮФЕОЙЕ ПДОПЗП ЖБКМБ Ч 500 УФТПЛ, ЧЩ НПЦЕФЕ ДЧБЦДЩ РПДХНБФШ, РТЕЦДЕ ЮЕН ЙУРПМШЪПЧБФШ Ч ОЕВПМШЫПН РТПЕЛФЕ УФЙМШ НОПЦЕУФЧЕООЩИ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ. уМПЧП РТЕДПУФЕТЕЦЕОЙС: ОБВПТ ЙЪ ДЕУСФЙ ЪБЗПМПЧПЮОЩИ ЖБКМПЧ РМАУ УФБОДБТФОЩЕ ЪБЗПМПЧПЮОЩЕ ЖБКМЩ ПВЩЮОП МЕЗЮЕ РПДДБАФУС ХРТБЧМЕОЙА. у ДТХЗПК УФПТПОЩ, ЕУМЙ ЧЩ ТБЪВЙМЙ ПРЙУБОЙС Ч ВПМШЫПК РТПЗТБННЕ ОБ МПЗЙЮЕУЛЙ НЙОЙНБМШОЩЕ РП ТБЪНЕТХ ЪБЗПМПЧПЮОЩЕ ЖБКМЩ (РПНЕЭБС ЛБЦДПЕ ПРЙУБОЙЕ УФТХЛФХТЩ Ч УЧПК ПФДЕМШОЩК ЖБКМ Й Ф.Д.), Х ЧБУ МЕЗЛП НПЦЕФ РПМХЮЙФШУС ОЕТБЪВЕТЙИБ ЙЪ УПФЕО ЖБКМПЧ. 4.3.3 уЛТЩФЙЕ дБООЩИ йУРПМШЪХС ЪБЗПМПЧПЮОЩЕ ЖБКМЩ РПМШЪПЧБФЕМШ НПЦЕФ ПРТЕДЕМСФШ СЧОЩК ЙОФЕТЖЕКУ, ЮФПВЩ ПВЕУРЕЮЙФШ УПЗМБУПЧБООПЕ ЙУРПМШЪПЧБОЙЕ ФЙРПЧ Ч РТПЗТБННЕ. у ДТХЗПК УФПТПОЩ, РПМШЪПЧБФЕМШ НПЦЕФ ПВПКФЙ ЙОФЕТЖЕКУ, ЪБДБЧБЕНЩК ЪБЗПМПЧПЮОЩН ЖБКМПН, ЧЧПДС Ч .c ЖБКМЩ ПРЙУБОЙС extern.

ъБНЕФШФЕ, ЮФП ФБЛПК УФЙМШ ЛПНРПОПЧЛЙ ОЕ ТЕЛПНЕОДХЕФУС: // file1.c: // "extern" ОЕ ЙУРПМШЪХЕФУС int a = 7; const c = 8; void f(long) { /* ... */ } // file2.c: // "extern" Ч .c ЖБКМЕ extern int a; extern const c; extern f(int); int g() { return f(a+c); }

рПУЛПМШЛХ ПРЙУБОЙС extern Ч file2.c ОЕ ЧЛМАЮБАФУС ЧНЕУФЕ У ПРТЕДЕМЕОЙСНЙ Ч ЖБКМЕ file1.c, ЛПНРЙМСФПТ ОЕ НПЦЕФ РТПЧЕТЙФШ УПЗМБУПЧБООПУФШ ЬФПК РТПЗТБННЩ. уМЕДПЧБФЕМШОП, ЕУМЙ ФПМШЛП ЪБЗТХЪЮЙЛ ОЕ ПЛБЦЕФУС ЗПТБЪДП УППВТБЪЙФЕМШОЕЕ УТЕДОЕЗП, ДЧЕ ПЫЙВЛЙ Ч ЬФПК РТПЗТБННЕ ПУФБОХФУС, Й ЙИ РТЙДЕФУС ЙУЛБФШ РТПЗТБННЙУФХ.

рПМШЪПЧБФЕМШ НПЦЕФ ЪБЭЙФЙФШ ЖБКМ ПФ ФБЛПК ОЕДЙУГЙРМЙОЙТПЧБООПК ЛПНРПОПЧЛЙ, ПРЙУБЧ ЙНЕОБ, ЛПФПТЩЕ ОЕ РТЕДОБЪОБЮЕОЩ ДМС ПВЭЕЗП РПМШЪПЧБОЙС, ЛБЛ static, ЮФПВЩ ЙИ ПВМБУФША ЧЙДЙНПУФЙ ВЩМ ЖБКМ, Й ПОЙ ВЩМЙ УЛТЩФЩ ПФ ПУФБМШОЩИ ЮБУФЕК РТПЗТБННЩ. оБРТЙНЕТ: // table.c: ПРТЕДЕМЕОЙС ФБВМЙГЩ ЙНЕО #include "error.h" #include #include "table.h" const TBLSZ = 23; static name* table[TBLSZ]; name* look(char* p; int ins) { /* ... */ }

ьФП ЗБТБОФЙТХЕФ, ЮФП МАВПК ДПУФХР Л table ДЕКУФЧЙФЕМШОП ВХДЕФ ПУХЭЕУФЧМСФШУС ЙНЕООП ЮЕТЕЪ look(). "рТСФБФШ" ЛПОУФБОФХ TBLSZ ОЕ ПВСЪБФЕМШОП. 4.4 жБКМЩ ЛБЛ нПДХМЙ ч РТЕДЩДХЭЕН ТБЪДЕМЕ .c Й .h ЖБКМЩ ЧНЕУФЕ ПРТЕДЕМСМЙ ЮБУФШ РТПЗТБННЩ. жБКМ .h СЧМСЕФУС ЙОФЕТЖЕКУПН, ЛПФПТЩК ЙУРПМШЪХАФ ДТХЗЙЕ ЮБУФЙ РТПЗТБННЩ; .c ЖБКМ ЪБДБЕФ ТЕБМЙЪБГЙА. фБЛПК ПВЯЕЛФ ЮБУФП ОБЪЩЧБАФ НПДХМЕН. дПУФХРОЩНЙ ДЕМБАФУС ФПМШЛП ФЕ ЙНЕОБ, ЛПФПТЩЕ ОЕПВИПДЙНП ЪОБФШ РПМШЪПЧБФЕМА, ПУФБМШОЩЕ УЛТЩФЩ. ьФП ЛБЮЕУФЧП ЮБУФП ОБЪЩЧБАФ УЛТЩФЙЕН ДБООЩИ, ИПФС ДБООЩЕ - МЙЫШ ЮБУФШ ФПЗП, ЮФП НПЦЕФ ВЩФШ УЛТЩФП. нПДХМЙ ФБЛПЗП ЧЙДБ ПВЕУРЕЮЙЧБАФ ВПМШЫХА ЗЙВЛПУФШ. оБРТЙНЕТ, ТЕБМЙЪБГЙС НПЦЕФ УПУФПСФШ ЙЪ ПДОПЗП ЙМЙ ВПМЕЕ .c ЖБКМПЧ, Й Ч ЧЙДЕ .h ЖБКМПЧ НПЦЕФ ВЩФШ РТЕДПУФБЧМЕОП ОЕУЛПМШЛП ЙОФЕТЖЕКУПЧ. йОЖПТНБГЙС, ЛПФПТХА РПМШЪПЧБФЕМА ЪОБФШ ОЕ ПВСЪБФЕМШОП, ЙУЛХУОП УЛТЩФБ Ч .c ЖБКМБИ. еУМЙ ЧБЦОП, ЮФП РПМШЪПЧБФЕМШ ОЕ ДПМЦЕО ФПЮОП ЪОБФШ, ЮФП УПДЕТЦЙФУС Ч .c ЖБКМБИ, ОЕ ОБДП ДЕМБФШ ЙИ ДПУФХРОЩНЙ Ч ЙУИПДПН ЧЙДЕ. дПУФБФПЮОП ЬЛЧЙЧБМЕОФОЩИ ЙН ЧЩИПДОЩИ ЖБКМПЧ ЛПНРЙМСФПТБ (.o ЖБКМПЧ).

йОПЗДБ ЧПЪОЙЛБЕФ УМПЦОПУФШ, УПУФПСЭБС Ч ФПН, ЮФП РПДПВОБС ЗЙВЛПУФШ ДПУФЙЗБЕФУС ВЕЪ ЖПТНБМШОПК УФТХЛФХТЩ. уБН СЪЩЛ ОЕ ТБУРПЪОБЕФ ФБЛПК НПДХМШ ЛБЛ ПВЯЕЛФ, Й Х ЛПНРЙМСФПТБ ОЕФ ЧПЪНПЦОПУФЙ ПФМЙЮЙФШ .h ЖБКМЩ, ПРТЕДЕМСАЭЙЕ ЙНЕОБ, ЛПФПТЩЕ ДПМЦОЩ ЙУРПМШЪПЧБФШ ДТХЗЙЕ НПДХМЙ (ЬЛУРПТФЙТХЕНЩЕ), ПФ .h ЖБКМПЧ, ЛПФПТЩЕ ПРЙУЩЧБАФ ЙНЕОБ ЙЪ ДТХЗЙИ НПДХМЕК (ЙНРПТФЙТХЕНЩЕ).

ч ДТХЗЙИ УМХЮБСИ НПЦЕФ ЧПЪОЙЛОХФШ ФБ РТПВМЕНБ, ЮФП НПДХМШ ПРТЕДЕМСЕФ НОПЦЕУФЧП ПВЯЕЛФПЧ, Б ОЕ ОПЧЩК ФЙР. оБРТЙНЕТ, НПДХМШ table ПРТЕДЕМСЕФ ПДОХ ФБВМЙГХ, Й ЕУМЙ ЧБН ОХЦОП ДЧЕ ФБВМЙГЩ, ФП ОЕФ РТПУФПЗП УРПУПВБ ЪБДБФШ ЧФПТХА ФБВМЙГХ У РПНПЭША РПОСФЙС НПДХМС. тЕЫЕОЙЕ ЬФПК РТПВМЕНЩ РТЙЧПДЙФУС Ч зМБЧЕ 5.

лБЦДЩК УФБФЙЮЕУЛЙ ТБЪНЕЭЕООЩК ПВЯЕЛФ РП ХНПМЮБОЙА ЙОЙГЙБМЙЪЙТХЕФУС ОХМЕН, РТПЗТБННЙУФ НПЦЕФ ЪБДБФШ ДТХЗЙЕ (ЛПОУФБОФОЩЕ) ЪОБЮЕОЙС. ьФП ФПМШЛП УБНЩК РТЙНЙФЙЧОЩК ЧЙД ЙОЙГЙБМЙЪБГЙЙ. л УЮБУФША, У РПНПЭША ЛМБУУПЧ НПЦОП ЪБДБФШ ЛПД, ЛПФПТЩК ЧЩРПМОСЕФУС ДМС ЙОЙГЙБМЙЪБГЙЙ РЕТЕД ФЕН, ЛБЛ НПДХМШ ЛБЛЙН- МЙВП ПВТБЪПН ЙУРПМШЪХЕФУС, Й/ЙМЙ ЛПД, ЛПФПТЩК ЪБРХУЛБЕФУС ДМС ПЮЙУФЛЙ РПУМЕ РПУМЕДОЕЗП ЙУРПМШЪПЧБОЙС НПДХМС; УН. #5.5.2. 4.5 лБЛ уПЪДБФШ вЙВМЙПФЕЛХ жТБЪЩ ФЙРБ "РПНЕЭЕО Ч ВЙВМЙПФЕЛХ" Й "ЙЭЕФУС Ч ЛБЛПК-ФП ВЙВМЙПФЕЛЕ" ЙУРПМШЪХАФУС ЮБУФП (Й Ч ЬФПК ЛОЙЗЕ, Й Ч ДТХЗЙИ), ОП ЮФП ЬФП ПЪОБЮБЕФ ДМС C++ РТПЗТБННЩ? л УПЦБМЕОЙА, ПФЧЕФ ЪБЧЙУЙФ ПФ ФПЗП, ЛБЛБС ПРЕТБГЙПООБС УЙУФЕНБ ЙУРПМШЪХЕФУС; Ч ЬФПН ТБЪДЕМЕ ПВЯСУОСЕФУС, ЛБЛ УПЪДБФШ ВЙВМЙПФЕЛХ Ч 8-ПК ЧЕТУЙЙ УЙУФЕНЩ UNIX. дТХЗЙЕ УЙУФЕНЩ РТЕДПУФБЧМСАФ БОБМПЗЙЮОЩЕ ЧПЪНПЦОПУФЙ.

вЙВМЙПФЕЛБ Ч УЧПЕК ПУОПЧЕ СЧМСЕФУС НОПЦЕУФЧПН .o ЖБКМПЧ, РПМХЮЕООЩИ Ч ТЕЪХМШФБФЕ ЛПНРЙМСГЙЙ УППФЧЕФУФЧХАЭЕЗП НОПЦЕУФЧБ .c ЖБКМПЧ. пВЩЮОП ЙНЕЕФУС ПДЙО ЙМЙ ВПМЕЕ .h ЖБКМПЧ, Ч ЛПФПТЩИ УПДЕТЦБФУС ПРЙУБОЙС ДМС ЙУРПМШЪПЧБОЙС ЬФЙИ .o ЖБКМПЧ. ч ЛБЮЕУФЧЕ РТЙНЕТБ ТБУУНПФТЙН УМХЮБК, ЛПЗДБ ОБН ОБДП ЪБДБФШ (ПВЩЮОЩН УРПУПВПН) ОБВПТ НБФЕНБФЙЮЕУЛЙИ ЖХОЛГЙК ДМС ОЕЛПФПТПЗП ОЕПРТЕДЕМЕООПЗП НОПЦЕУФЧБ РПМШЪПЧБФЕМЕК. ъБЗПМПЧПЮОЩК ЖБКМ НПЗ ВЩ ЧЩЗМСДЕФШ РТЙНЕТОП ФБЛ: extern double sqrt(double); // РПДНОПЦЕУФЧП extern double sin(double); extern double cos(double); extern double exp(double); extern double log(double);

Б ПРТЕДЕМЕОЙС ЬФЙИ ЖХОЛГЙК ИТБОЙМЙУШ ВЩ, УППФЧЕФУФЧЕООП, Ч ЖБКМБИ sqrt.c, sin.c, cos.c, exp.c Й log.c.

вЙВМЙПФЕЛХ У ЙНЕОЕН math.h НПЦОП УПЪДБФШ, ОБРТЙНЕТ, ФБЛ: $ CC -c sqrt.c sin.c cos.c exp.c log.c $ ar cr math.a sqrt.o sin.o cos.o exp.o log.o $ ranlib math.a

чОБЮБМЕ ЙУИПДОЩЕ ЖБКМЩ ЛПНРЙМЙТХАФУС Ч ЬЛЧЙЧБМЕОФОЩЕ ЙН ПВЯЕЛФОЩЕ ЖБКМЩ. ъБФЕН ЙУРПМШЪХЕФУС ЛПНБОДБ ar, ЮФПВЩ УПЪДБФШ БТИЙЧ У ЙНЕОЕН math.a. й, ОБЛПОЕГ, ЬФПФ БТИЙЧ ЙОДЕЛУЙТХЕФУС ДМС ХУЛПТЕОЙС ДПУФХРБ. еУМЙ Ч ЧБЫЕК УЙУФЕНЕ ОЕФ ЛПНБОДЩ runlib, ЪОБЮЙФ ПОБ ЧБН, ЧЕТПСФОП, ОЕ РПОБДПВЙФУС. рПДТПВОПУФЙ РПУНПФТЙФЕ, РПЦБМХКУФБ, Ч ЧБЫЕН ТХЛПЧПДУФЧЕ Ч ТБЪДЕМЕ РПД ЪБЗПМПЧЛПН ar. йУРПМШЪПЧБФШ ВЙВМЙПФЕЛХ НПЦОП, ОБРТЙНЕТ, ФБЛ: $ CC myprog.c math.a

фЕРЕТШ ТБЪВЕТЕНУС, Ч ЮЕН ЦЕ РТЕЙНХЭЕУФЧБ ЙУРПМШЪПЧБОЙС math.a РЕТЕД РТПУФП ОЕРПУТЕДУФЧЕООЩН ЙУРПМШЪПЧБОЙЕН .o ЖБКМПЧ? оБРТЙНЕТ: $ CC myprog.c sqrt.o sin.o cos.o exp.o log.o

дМС ВПМШЫЙОУФЧБ РТПЗТБНН ПРТЕДЕМЙФШ РТБЧЙМШОЩК ОБВПТ .o ЖБКМПЧ, ОЕУПНОЕООП, ОЕРТПУФП. ч РТЙЧЕДЕООПН ЧЩЫЕ РТЙНЕТЕ ПОЙ ЧЛМАЮБМЙУШ ЧУЕ, ОП ЕУМЙ ЖХОЛГЙЙ Ч myprog.c ЧЩЪЩЧБАФ ФПМШЛП ЖХОЛГЙЙ sqrt() Й cos(), ФП ЛБЦЕФУС, ЮФП ВХДЕФ ДПУФБФПЮОП $ CC myprog.c sqrt.o cos.o

оП ЬФП ОЕ ФБЛ, РПУЛПМШЛХ cos.c ЙУРПМШЪХЕФ sin.c.

лПНРПОПЧЭЙЛ, ЧЩЪЩЧБЕНЩК ЛПНБОДПК CC ДМС ПВТБВПФЛЙ .a ЖБКМБ (Ч ДБООПН УМХЮБЕ, ЖБКМБ math.a) ЪОБЕФ, ЛБЛ ЙЪ ФПЗП НОПЦЕУФЧБ, ЛПФПТПЕ ЙУРПМШЪПЧБМПУШ ДМС УПЪДБОЙС .a ЖБКМБ, ЙЪЧМЕЮШ ФПМШЛП ОЕПВИПДЙНЩЕ .o ЖБКМЩ.

дТХЗЙНЙ УМПЧБНЙ, ЙУРПМШЪХС ВЙВМЙПФЕЛХ НПЦОП ЧЛМАЮБФШ НОПЗП ПРТЕДЕМЕОЙК У РПНПЭША ПДОПЗП ЙНЕОЙ (ЧЛМАЮЕОЙС ПРТЕДЕМЕОЙК ЖХОЛГЙК Й РЕТЕНЕООЩИ, ЙУРПМШЪХЕНЩИ ЧОХФТЕООЙНЙ ЖХОЛГЙСНЙ, ОЙЛПЗДБ ОЕ ЧЙДОЩ РПМШЪПЧБФЕМА), Й, ЛТПНЕ ФПЗП, ПВЕУРЕЮЙФШ, ЮФП Ч ТЕЪХМШФБФЕ Ч РТПЗТБННХ ВХДЕФ ЧЛМАЮЕОП НЙОЙНБМШОПЕ ЛПМЙЮЕУФЧП ПРТЕДЕМЕОЙК. 4.6 жХОЛГЙЙ 4.6.1 пРЙУБОЙС жХОЛГЙК 4.6.2 пРТЕДЕМЕОЙС жХОЛГЙК 4.6.3 рЕТЕДБЮБ рБТБНЕФТПЧ 4.6.4 чПЪЧТБФ ъОБЮЕОЙС 4.6.5 чЕЛФПТОЩЕ рБТБНЕФТЩ 4.6.6 рБТБНЕФТЩ РП хНПМЮБОЙА 4.6.7 рЕТЕЗТХЪЛБ йНЕО жХОЛГЙК 4.6.8 оЕЪБДБООПЕ юЙУМП рБТБНЕФТПЧ 4.6.9 хЛБЪБФЕМШ ОБ жХОЛГЙА пВЩЮОЩК УРПУПВ УДЕМБФШ ЮФП-МЙВП Ч C++ РТПЗТБННЕ - ЬФП ЧЩЪЧБФШ ЖХОЛГЙА, ЛПФПТБС ЬФП ДЕМБЕФ. пРТЕДЕМЕОЙЕ ЖХОЛГЙЙ СЧМСЕФУС УРПУПВПН ЪБДБФШ ФП, ЛБЛ ДПМЦОП ДЕМБФШУС ОЕЛПФПТПЕ ДЕКУФЧЙЕ. жХОЛГЙС ОЕ НПЦЕФ ВЩФШ ЧЩЪЧБОБ, РПЛБ ПОБ ОЕ ПРЙУБОБ. 4.6.1 пРЙУБОЙС жХОЛГЙК пРЙУБОЙЕ ЖХОЛГЙЙ ЪБДБЕФ ЙНС ЖХОЛГЙЙ, ФЙР ЧПЪЧТБЭБЕНПЗП ЖХОЛГЙЕК ЪОБЮЕОЙС (ЕУМЙ ФБЛПЧПЕ ЕУФШ) Й ЮЙУМП Й ФЙРЩ РБТБНЕФТПЧ, ЛПФПТЩЕ ДПМЦОЩ ВЩФШ Ч ЧЩЪПЧЕ ЖХОЛГЙЙ. оБРТЙНЕТ: extern double sqrt(double); extern elem* next_elem(); extern char* strcpy(char* to, const char* from); extern void exit(int);

уЕНБОФЙЛБ РЕТЕДБЮЙ РБТБНЕФТПЧ ЙДЕОФЙЮОБ УЕНБОФЙЛЕ ЙОЙГЙБМЙЪБГЙЙ. рТПЧЕТСАФУС ФЙРЩ РБТБНЕФТПЧ, Й ЛПЗДБ ОХЦОП РТПЙЪЧПДЙФУС ОЕСЧОПЕ РТЕПВТБЪПЧБОЙЕ ФЙРБ. оБРТЙНЕТ, ЕУМЙ ВЩМЙ ЪБДБОЩ РТЕДЩДХЭЙЕ ПРТЕДЕМЕОЙС, ФП double sr2 = sqrt(2);

ВХДЕФ РТБЧЙМШОП ПВТБЭБФШУС Л ЖХОЛГЙЙ sqrt() УП ЪОБЮЕОЙЕН У РМБЧБАЭЕК ФПЮЛПК 2.0. ъОБЮЕОЙЕ ФБЛПК РТПЧЕТЛЙ ФЙРБ Й РТЕПВТБЪПЧБОЙС ФЙРБ ПЗТПНОП.

пРЙУБОЙЕ ЖХОЛГЙЙ НПЦЕФ УПДЕТЦБФШ ЙНЕОБ РБТБНЕФТПЧ. ьФП НПЦЕФ РПНПЮШ ЮЙФБФЕМА, ОП ЛПНРЙМСФПТ ЬФЙ ЙНЕОБ РТПУФП ЙЗОПТЙТХЕФ. 4.6.2 пРТЕДЕМЕОЙС жХОЛГЙК лБЦДБС ЖХОЛГЙС, ЧЩЪЩЧБЕНБС Ч РТПЗТБННЕ, ДПМЦОБ ВЩФШ ЗДЕ-ФП ПРТЕДЕМЕОБ (ФПМШЛП ПДЙО ТБЪ). пРТЕДЕМЕОЙЕ ЖХОЛГЙЙ - ЬФП ПРЙУБОЙЕ ЖХОЛГЙЙ, Ч ЛПФПТПН РТЙЧПДЙФУС ФЕМП ЖХОЛГЙЙ. оБРТЙНЕТ: extern void swap(int*, int*); // ПРЙУБОЙЕ void swap(int*, int*) // ПРТЕДЕМЕОЙЕ { int t = *p; *p =*q; *q = t; }

юФПВЩ ЙЪВЕЦБФШ ТБУИПДПЧ ОБ ЧЩЪПЧ ЖХОЛГЙЙ, ЖХОЛГЙА НПЦОП ПРЙУБФШ ЛБЛ inline (#1.12), Б ЮФПВЩ ПВЕУРЕЮЙФШ ВПМЕЕ ВЩУФТЩК ДПУФХР Л РБТБНЕФТБН, ЙИ НПЦОП ПРЙУБФШ ЛБЛ register (#2.3.11). пВБ УТЕДУФЧБ НПЗХФ ЙУРПМШЪПЧБФШУС ОЕРТБЧЙМШОП, Й ЙИ УМЕДХЕФ ЙЪВЕЗБФШ ЧЕЪДЕ ЗДЕ ЕУФШ ЛБЛЙЕ-МЙВП УПНОЕОЙС Ч ЙИ РПМЕЪОПУФЙ. 4.6.3 рЕТЕДБЮБ рБТБНЕФТПЧ лПЗДБ ЧЩЪЩЧБЕФУС ЖХОЛГЙС, ДПРПМОЙФЕМШОП ЧЩДЕМСЕФУС РБНСФШ РПД ЕЕ ЖПТНБМШОЩЕ РБТБНЕФТЩ, Й ЛБЦДЩК ЖПТНБМШОЩК РБТБНЕФТ ЙОЙГЙБМЙЪЙТХЕФУС УППФЧЕФУФЧХАЭЙН ЕНХ ЖБЛФЙЮЕУЛЙН РБТБНЕФТПН. уЕНБОФЙЛБ РЕТЕДБЮЙ РБТБНЕФТПЧ ЙДЕОФЙЮОБ УЕНБОФЙЛЕ ЙОЙГЙБМЙЪБГЙЙ. ч ЮБУФОПУФЙ, ФЙР ЖБЛФЙЮЕУЛПЗП РБТБНЕФТБ УПРПУФБЧМСЕФУС У ФЙРПН ЖПТНБМШОПЗП РБТБНЕФТБ, Й ЧЩРПМОСАФУС ЧУЕ УФБОДБТФОЩЕ Й ПРТЕДЕМЕООЩЕ РПМШЪПЧБФЕМЕН РТЕПВТБЪПЧБОЙС ФЙРПЧ. еУФШ ПУПВЩЕ РТБЧЙМБ ДМС РЕТЕДБЮЙ ЧЕЛФПТПЧ (#4.6.5), УТЕДУФЧП РЕТЕДБЧБФШ РБТБНЕФТ ВЕЪ РТПЧЕТЛЙ (#4.6.8) Й УТЕДУФЧП ДМС ЪБДБОЙС РБТБНЕФТПЧ РП ХНПМЮБОЙА (#4.6.6). тБУУНПФТЙН void f(int val, int& ref) { val++; ref++; }

лПЗДБ ЧЩЪЩЧБЕФУС f(), val++ ХЧЕМЙЮЙЧБЕФ МПЛБМШОХА ЛПРЙА РЕТЧПЗП ЖБЛФЙЮЕУЛПЗП РБТБНЕФТБ, ФПЗДБ ЛБЛ ref++ ХЧЕМЙЮЙЧБЕФ ЧФПТПК ЖБЛФЙЮЕУЛЙК РБТБНЕФТ. оБРТЙНЕТ: int i = 1; int j = 1; f(i,j);

ХЧЕМЙЮЙЧБЕФ j, ОП ОЕ i. рЕТЧЩК РБТБНЕФТ, i, РЕТЕДБЕФУС РП ЪОБЮЕОЙА, ЧФПТПК РБТБНЕФТ, j, РЕТЕДБЕФУС РП УУЩМЛЕ. лБЛ ХЦЕ ПФНЕЮБМПУШ Ч #2.3.10, ЙУРПМШЪПЧБОЙЕ ЖХОЛГЙК, ЛПФПТЩЕ ЙЪНЕОСАФ РЕТЕДБООЩЕ РП УУЩМЛЕ РБТБНЕФТЩ, НПЗХФ УДЕМБФШ РТПЗТБННХ ФТХДОП ЮЙФБЕНПК, Й ЙИ УМЕДХЕФ ЙЪВЕЗБФШ (ОП УН. #6.5 Й #8.4). пДОБЛП РЕТЕДБЮБ ВПМШЫПЗП ПВЯЕЛФБ РП УУЩМЛЕ НПЦЕФ ВЩФШ ЗПТБЪДП ЬЖЖЕЛФЙЧОЕЕ, ЮЕН РЕТЕДБЮБ ЕЗП РП ЪОБЮЕОЙА. ч ЬФПН УМХЮБЕ РБТБНЕФТ НПЦОП ПРЙУБФШ ЛБЛ const, ЮФПВЩ ХЛБЪБФШ, ЮФП УУЩМЛБ РТЙНЕОСЕФУС РП УППВТБЦЕОЙСН ЬЖЖЕЛФЙЧОПУФЙ, Б ФБЛЦЕ ЮФПВЩ ОЕ РПЪЧПМЙФШ ЧЩЪЩЧБЕНПК ЖХОЛГЙЙ ЙЪНЕОСФШ ЪОБЮЕОЙЕ ПВЯЕЛФБ: void f(const large& arg) { // ЪОБЮЕОЙЕ "arg" ОЕ НПЦЕФ ВЩФШ ЙЪНЕОЕОП }

бОБМПЗЙЮОП, ПРЙУБОЙЕ РБТБНЕФТБ ХЛБЪБФЕМС ЛБЛ const УППВЭБЕФ ЮЙФБФЕМА, ЮФП ЪОБЮЕОЙЕ ПВЯЕЛФБ, ХЛБЪЩЧБЕНПЗП ХЛБЪБФЕМЕН, ЖХОЛГЙЕК ОЕ ЙЪНЕОСЕФУС. оБРТЙНЕТ: extern int strlen(const char*); // ЙЪ extern char* strcpy(char* to, const char* from); extern int strcmp(const char*, const char*);

чБЦОПУФШ ФБЛПК РТБЛФЙЛЙ ТБУФЕФ У ТБЪНЕТПН РТПЗТБННЩ.

ъБНЕФШФЕ, ЮФП УЕНБОФЙЛБ РЕТЕДБЮЙ РБТБНЕФТПЧ ПФМЙЮОБ ПФ УЕНБОФЙЛЙ РТЙУЧБЙЧБОЙС. ьФП ЧБЦОП ДМС const РБТБНЕФТПЧ, УУЩМПЮОЩИ РБТБНЕФТПЧ Й РБТБНЕФТПЧ ОЕЛПФПТЩИ ФЙРПЧ, ПРТЕДЕМСЕНЩИ РПМШЪПЧБФЕМЕН (#6.6). 4.6.4 чПЪЧТБФ ъОБЮЕОЙС йЪ ЖХОЛГЙЙ, ЛПФПТБС ОЕ ПРЙУБОБ ЛБЛ void, НПЦОП (Й ДПМЦОП) ЧПЪЧТБЭБФШ ЪОБЮЕОЙЕ. чПЪЧТБЭБЕНПЕ ЪОБЮЕОЙЕ ЪБДБЕФУС ПРЕТБФПТПН return. оБРТЙНЕТ: int fac(int n) {return (n>1) ? n*fac(n-1) : 1; }

ч ЖХОЛГЙЙ НПЦЕФ ВЩФШ ВПМШЫЕ ПДОПЗП ПРЕТБФПТБ return: int fac(int n) { if (n > 1) return n*fac(n-1); else return 1; }

лБЛ Й УЕНБОФЙЛБ РЕТЕДБЮЙ РБТБНЕФТПЧ, УЕНБОФЙЛБ ЧПЪЧТБФБ ЖХОЛГЙЕК ЪОБЮЕОЙС ЙДЕОФЙЮОБ УЕНБОФЙЛЕ ЙОЙГЙБМЙЪБГЙЙ. чПЪЧТБЭБЕНПЕ ЪОБЮЕОЙЕ ТБУУНБФТЙЧБЕФУС ЛБЛ ЙОЙГЙБМЙЪБФПТ РЕТЕНЕООПК ЧПЪЧТБЭБЕНПЗП ФЙРБ. фЙР ЧПЪЧТБЭБЕНПЗП ЧЩТБЦЕОЙС РТПЧЕТСЕФУС ОБ УПЗМБУПЧБООПУФШ У ЧПЪЧТБЭБЕНЩН ФЙРПН Й ЧЩРПМОСАФУС ЧУЕ УФБОДБТФОЩЕ Й ПРТЕДЕМЕООЩЕ РПМШЪПЧБФЕМЕН РТЕПВТБЪПЧБОЙС ФЙРПЧ. оБРТЙНЕТ: double f() { // ... return 1; // ОЕСЧОП РТЕПВТБЪХЕФУС Л double(1) }

лБЦДЩК ТБЪ, ЛПЗДБ ЧЩЪЩЧБЕФУС ЖХОЛГЙС, УПЪДБЕФУС ОПЧБС ЛПРЙС ЕЕ РБТБНЕФТПЧ Й БЧФПНБФЙЮЕУЛЙИ РЕТЕНЕООЩИ. рПУМЕ ЧПЪЧТБФБ ЙЪ ЖХОЛГЙЙ РБНСФШ ЙУРПМШЪХЕФУС ЪБОПЧП, РПЬФПНХ ЧПЪЧТБЭБФШ ХЛБЪБФЕМШ ОБ МПЛБМШОХА РЕТЕНЕООХА ОЕТБЪХНОП. уПДЕТЦБОЙЕ ХЛБЪЩЧБЕНПЗП НЕУФБ ЙЪНЕОЙФУС ОЕРТЕДУЛБЪХЕНП: int* f() { int local = 1; // ... return &local; // ФБЛ ОЕ ДЕМБКФЕ }

ьФБ ПЫЙВЛБ НЕОЕЕ ПВЩЮОБ, ЮЕН ЬЛЧЙЧБМЕОФОБС ПЫЙВЛБ РТЙ ЙУРПМШЪПЧБОЙЙ УУЩМПЛ: int& f() { int local = 1; // ... return local; // ФБЛ ОЕ ДЕМБКФЕ }

л УЮБУФША, П ФБЛЙИ ЧПЪЧТБЭБЕНЩИ ЪОБЮЕОЙСИ РТЕДХРТЕЦДБЕФ ЛПНРЙМСФПТ. чПФ ДТХЗПК РТЙНЕТ: int& f() { return 1;} // ФБЛ ОЕ ДЕМБКФЕ 4.6.5 чЕЛФПТОЩЕ рБТБНЕФТЩ еУМЙ Ч ЛБЮЕУФЧЕ РБТБНЕФТБ ЖХОЛГЙЙ ЙУРПМШЪХЕФУС ЧЕЛФПТ, ФП РЕТЕДБЕФУС ХЛБЪБФЕМШ ОБ ЕЗП РЕТЧЩК ЬМЕНЕОФ. оБРТЙНЕТ: int strlen(const char*); void f() { char v[] = "a vector" strlen(v); strlen("Nicholas"); };

йОБЮЕ ЗПЧПТС, РТЙ РЕТЕДБЮЕ ЛБЛ РБТБНЕФТ ФЙРБ T[] РТЕПВТБЪХЕФУС Л T*. уМЕДПЧБФЕМШОП, РТЙУЧБЙЧБОЙЕ ЬМЕНЕОФХ ЧЕЛФПТОПЗП РБТБНЕФТБ ЙЪНЕОСЕФ ЪОБЮЕОЙЕ ЬМЕНЕОФБ ЧЕЛФПТБ, ЛПФПТЩК СЧМСЕФУС РБТБНЕФТПН. дТХЗЙНЙ УМПЧБНЙ, ЧЕЛФПТ ПФМЙЮБЕФУС ПФ ЧУЕИ ПУФБМШОЩИ ФЙРПЧ ФЕН, ЮФП ЧЕЛФПТ ОЕ РЕТЕДБЕФУС (Й ОЕ НПЦЕФ РЕТЕДБЧБФШУС) РП ЪОБЮЕОЙА.

тБЪНЕТ ЧЕЛФПТБ ОЕДПУФХРЕО ЧЩЪЩЧБЕНПК ЖХОЛГЙЙ. ьФП НПЦЕФ ВЩФШ ОЕХДПВОП, ОП ЬФХ УМПЦОПУФШ НПЦОП ПВПКФЙ ОЕУЛПМШЛЙНЙ УРПУПВБНЙ. уФТПЛЙ ПЛБОЮЙЧБАФУС ОХМЕН, РПЬФПНХ ЙИ ТБЪНЕТ НПЦОП МЕЗЛП ЧЩЮЙУМЙФШ. дМС ДТХЗЙИ ЧЕЛФПТПЧ НПЦОП РЕТЕДБЧБФШ ЧФПТПК РБТБНЕФТ, ЛПФПТЩК ЪБДБЕФ ТБЪНЕТ, ЙМЙ ПРТЕДЕМЙФШ ФЙР, УПДЕТЦБЭЙК ХЛБЪБФЕМШ Й ЙОДЙЛБФПТ ДМЙОЩ, Й РЕТЕДБЧБФШ ЕЗП ЧНЕУФП РТПУФП ЧЕЛФПТБ (УН. ФБЛЦЕ #1.11). оБРТЙНЕТ: void compute1(int* vec_ptr, int vec_size); // ПДЙО УРПУПВ struct vec { // ДТХЗПК УРПУПВ int* ptr; int size; }; void compute2(vec v);

у НОПЗПНЕТОЩНЙ НБУУЙЧБНЙ ЧУЕ ИЙФТЕЕ, ОП ЮБУФП НПЦОП ЧНЕУФП ОЙИ ЙУРПМШЪПЧБФШ ЧЕЛФПТЩ ХЛБЪБФЕМЕК, ЛПФПТЩЕ ОЕ ФТЕВХАФ УРЕГЙБМШОПЗП ТБУУНПФТЕОЙС. оБРТЙНЕТ: char* day[] = { "mon", "tue", "wed", "thu", "fri", "sat", "sun" };

у ДТХЗПК УФПТПОЩ, ТБУУНПФТЙН ПРТЕДЕМЕОЙЕ ЖХОЛГЙЙ, ЛПФПТБС ТБВПФБЕФ У ДЧХНЕТОЩНЙ НБФТЙГБНЙ. еУМЙ ТБЪНЕТОПУФШ ЙЪЧЕУФОБ ОБ УФБДЙЙ ЛПНРЙМСГЙЙ, ФП ОЙЛБЛЙИ РТПВМЕН ОЕФ: void print_m34(int m[3][4]) { for (int i = 0; i

Соседние файлы в папке Введение в язык С++ - Б. Страустрап