<?php
echo "<p class=bmenu><span class=MsoHyperlink><a href=\"#_Toc219967970\">Глава 4\n";
echo "Функции и Файлы<span style='color:windowtext;display:none;text-decoration:none'>__ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>109</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219967971\">4.1 Введение<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>109</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219967972\">4.2 Компоновка<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>110</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219967973\">4.3 Заголовочные Файлы<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>112</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967974\">4.3.1 Один\n";
echo "Заголовочный Файл<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>113</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967975\">4.3.2\n";
echo "Множественные Заголовочные Файлы<span style='color:windowtext;display:none;\n";
echo "text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>116</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967976\">4.3.3\n";
echo "Сокрытие Данных<span style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>118</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219967977\">4.4 Файлы как Модули<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>119</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219967978\">4.5 Как Создать Библиотеку<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>120</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><span style='font-variant:normal !important;\n";
echo "text-transform:uppercase'><a href=\"#_Toc219967979\">4.6 Функции<span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>121</span></a></span></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967980\">4.6.1\n";
echo "Описания Функций<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>121</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967981\">4.6.2\n";
echo "Определения Функций<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>122</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967982\">4.6.3\n";
echo "Передача Параметров<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>122</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967983\">4.6.4\n";
echo "Возврат Значения<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>123</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967984\">4.6.5\n";
echo "Векторные Параметры<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>124</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967985\">4.6.6\n";
echo "Параметры по Умолчанию<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>126</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967986\">4.6.7\n";
echo "Перегрузка Имен Функций<span style='color:windowtext;display:none;text-decoration:\n";
echo "none'>_ </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>127</span></a></span></p>\n";
echo "\n";
echo "<p class=menu><span class=MsoHyperlink><a href=\"#_Toc219967987\">4.6.8\n";
echo "Незаданное Число Параметров<span style='color:windowtext;display:none;\n";
echo "text-decoration:none'> </span><span\n";
echo "style='color:windowtext;display:none;text-decoration:none'>129</span></a></span></p>\n";
echo "\n";
echo "<h1><a name=\"_Toc219967970\">Глава 4 Функции и Файлы</a></h1>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:264.0pt;margin-bottom:.0001pt;text-indent:-59.4pt;text-autospace:\n";
echo "none'>Итерация свойственна человеку, рекурсия божественна.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:303.6pt;text-autospace:none'>- Л. Питер Дойч</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Все нетривиальные программы собираются из\n";
echo "нескольких раздельно компилируемых единиц (их принято называть просто файлами).\n";
echo "В этой главе описано, как раздельно откомпилирован­ные функции могут обращаться\n";
echo "друг к другу, как такие функции могут совместно пользоваться данными (разделять\n";
echo "данные), и как можно обеспечить согласованность типов, которые использу­ются в\n";
echo "разных файлах программы. Функции обсуждаются довольно подробно. Сюда входят\n";
echo "передача параметров, параметры по умол­чанию, перегрузка имен функций, и,\n";
echo "конечно же, описание и оп­ределение функций. В конце описываются макросы.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219967971\">4.1 Введение</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Иметь всю программу в одном файле обычно\n";
echo "невозможно, поскольку коды стандартных библиотек и операционной системы\n";
echo "находятся где-то в другом месте. Кроме того, хранить весь текст\n";
echo "пользовательской программы в одном файле как правило непрактично и неудобно.\n";
echo "Способ организации программы в файлы может помочь читающему охватить всю\n";
echo "структуру программы, а также может дать возможность компилятору реализовать эту\n";
echo "структуру. Поскольку единицей компиляции является файл, то во всех случаях,\n";
echo "когда в файл вносится изменение (сколь бы мало оно ни было), весь файл нужно\n";
echo "компилировать заново. Даже для программы умеренных размеров время,\n";
echo "затрачиваемое на переком­пиляцию, можно значительно снизить с помощью разбиения\n";
echo "прог­раммы на файлы подходящих размеров.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Рассмотрим пример с калькулятором. Он был представлен в\n";
echo "виде одного исходного файла. Если вы его набили, то у вас на­верняка были\n";
echo "небольшие трудности с расположением описаний в правильном порядке, и пришлось\n";
echo "использовать по меньшей мере одно &quot;фальшивое&quot; описание, чтобы\n";
echo "компилятор смог обработать взаимно рекурсивные функции expr(), term() и prim().\n";
echo "В тексте уже отмечалось, что программа состоит из четырех частей (лек­сического\n";
echo "анализатора, программы синтаксического разбора, таблицы имен и драйвера), но\n";
echo "это никак не было отражено в тексте самой программы. По сути дела, калькулятор\n";
echo "был написан по-другому. Так это не делается; даже если в этой программе\n";
echo "&quot;на выброс&quot; пренебречь всеми соображениями методологии прог­раммирования,\n";
echo "эксплуатации и эффективности компиляции, автор все равно разобьет эту программу\n";
echo "в 200 строк на несколько файлов, чтобы программировать было приятнее.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-align:justify;text-indent:33.0pt;text-autospace:\n";
echo "none'>Программа, состоящая из нескольких раздельно компилируе­мых файлов,\n";
echo "должна быть согласованной в смысле использования имен и типов, точно так же,\n";
echo "как и программа, состоящая из од­ного исходного файла. В принципе, это может\n";
echo "обеспечить и ком­поновщик*. Компоновщик - это программа, стыкующая отдельно\n";
echo "скомпилированные части вместе. Компоновщик часто (путая) на­зывают загрузчиком.\n";
echo "В UNIX'е компоновщик называется ld. Одна­ко компоновщики, имеющиеся в\n";
echo "большинстве систем, обеспечивают очень слабую поддержку проверки\n";
echo "согласованности.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>--------------------</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>* или линкер. (прим. перев.)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-align:justify;text-indent:33.0pt;text-autospace:\n";
echo "none'>Программист может скомпенсировать недостаток поддержки со стороны\n";
echo "компоновщика, предоставив дополнительную информа­цию о типах (описания). После\n";
echo "этого согласованность программы обеспечивается проверкой согласованности\n";
echo "описаний, которые находятся в отдельно компилируемых частях. Средства, которые\n";
echo "это обеспечивают, в вашей системе будут. С++ разработан так, чтобы\n";
echo "способствовать такой явной компоновке*.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>--------------------</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>* C разработан так, чтобы в большинстве случаев\n";
echo "позво­лять осуществлять неявную компоновку. Применение C, однако, возросло\n";
echo "неимоверно, поэтому случаи, когда можно использовать неявную линковку, сейчас\n";
echo "составляют незначительное меньшинс­тво. (прим. автора)</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219967972\">4.2 Компоновка</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Если не указано иное, то имя, не являющееся\n";
echo "локальным для функции или класса, в каждой части программы, компилируе­мой\n";
echo "отдельно, должно относиться к одному и тому же типу, зна­чению, функции или\n";
echo "объекту. То есть, в программе может быть только один нелокальный тип, значение,\n";
echo "функция или объект с этим именем. Рассмотрим, например, два файла:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file1.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'>int f() (* /* что-то делает */\n";
echo "*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file2.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern int a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int f();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>void g() (* a =\n";
echo "f(); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>a и f(), используемые g() в файле file2.c,- те же,\n";
echo "что определены в файле file1.c. Ключевое слово extern (внешнее) указывает, что\n";
echo "описание a в file2.c является (только) описа­нием, а не определением. Если бы a\n";
echo "инициализировалось, extern было бы просто проигнорировано, поскольку описание с\n";
echo "инициа­лизацией всегда является определением. Объект в программе должен\n";
echo "определяться только один раз. Описываться он может много раз, но типы должны\n";
echo "точно согласовываться. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>// file1.c:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int b = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>extern int c;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file2.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double b;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>extern int c;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Здесь три ошибки: a определено дважды (int a;\n";
echo "является определением, которое означает int a=0;), b описано дважды с разными\n";
echo "типами, а c описано дважды, но не определено. Эти ви­ды ошибок не могут быть\n";
echo "обнаружены компилятором, который за один раз видит только один файл.\n";
echo "Компоновщик, однако, их об­наруживает.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Следующая программа не является С++ программой (хотя C\n";
echo "программой является):</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file1.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>int f() (*\n";
echo "return a; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file2.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>int g() (*\n";
echo "return f(); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Во-первых, file2.c не С++, потому что f() не была\n";
echo "описа­на, и поэтому компилятор будет недоволен. Во-вторых, (когда file2.c\n";
echo "фиксирован) программа не будет скомпонована, посколь­ку a определено дважды.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Имя можно сделать локальным в файле, описав его static.\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>// file1.c:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>static int a = 6;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>static int f()\n";
echo "(* /* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file2.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>static int a = 7;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>static int f()\n";
echo "(* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Поскольку каждое a и f описано как static,\n";
echo "получающаяся в результате программа является правильной. В каждом файле своя a\n";
echo "и своя f().</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Когда переменные и функции явно описаны как static, часть\n";
echo "программы легче понять (вам не надо никуда больше заг­лядывать). Использование\n";
echo "static для функций может, помимо этого, выгодно влиять на расходы по вызову\n";
echo "функции, поскольку дает оптимизирующему компилятору более простую работу.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Рассмотрим два файла:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file1.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>const int a = 6;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>inline int f() (* /* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>struct s (* int\n";
echo "a,b; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file1.c:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>const int a = 7;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>inline int f() (* /* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>struct s (* int\n";
echo "a,b; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Раз правило &quot;ровно одно определение&quot;\n";
echo "применяется к конс­тантам, inline-функциям и определениям функций так же, как\n";
echo "оно применяется к функциям и переменным, то file1.c и file2.c не могут быть\n";
echo "частями одной С++ программы. Но если это так, то как же два файла могут\n";
echo "использовать одни и те же типы и константы? Коротко, ответ таков: типы,\n";
echo "константы и т.п. могут определяться столько раз, сколько нужно, при условии,\n";
echo "что они определяются одинаково. Полный ответ несколько более сложен (это\n";
echo "объясняется в следующем разделе).</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219967973\">4.3 Заголовочные Файлы</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-align:justify;text-indent:33.0pt;text-autospace:\n";
echo "none'>Типы во всех описаниях одного и того же объекта должны быть\n";
echo "согласованными. Один из способов это достичь мог бы сос­тоять в обеспечении\n";
echo "средств проверки типов в компоновщике, но большинство компоновщиков - образца\n";
echo "1950-х, и их нельзя изме­нить по практическим соображениям*. Другой подход\n";
echo "состоит в обеспечении того, что исходный текст, как он передается на\n";
echo "рассмотрение компилятору, или согласован, или содержит инфор­мацию, которая\n";
echo "позволяет компилятору обнаружить несогласован­ности. Один несовершенный, но\n";
echo "простой способ достичь согласо­ванности состоит во включении заголовочных\n";
echo "файлов, содержащих интерфейсную информацию, в исходные файлы, в которых содер­жится\n";
echo "исполняемый код и/или определения данных.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-autospace:none'>--------------------</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>* Легко изменить один компоновщик, но сделав это и\n";
echo "напи­сав программу, которая зависит от усовершенствований, как вы будете\n";
echo "переносить эту программу в другое место? (прим. авто­ра)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Механизм включения с помощью #include - это\n";
echo "чрезвычайно простое средство обработки текста для сборки кусков исходной\n";
echo "программы в одну единицу (файл) для ее компиляции. Директива</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;to_be_included&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>замещает строку, в которой встретилось #include,\n";
echo "содер­жимым файла &quot;to_be_included&quot;. Его содержимым должен быть ис­ходный\n";
echo "текст на С++, поскольку дальше его будет читать компи­лятор. Часто включение\n";
echo "обрабатывается отдельной программой, называемой C препроцессором, которую\n";
echo "команда CC вызывает для преобразования исходного файла, который дал\n";
echo "программист, в файл без директив включения перед тем, как начать собственно\n";
echo "компиляцию. В другом варианте эти директивы обрабатывает ин­терфейсная система\n";
echo "компилятора по мере того, как они встреча­ются в исходном тексте. Если\n";
echo "программист хочет посмотреть на результат директив включения, можно\n";
echo "воспользоваться командой</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>CC -E file.c</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>для препроцессирования файла file.c точно также,\n";
echo "как это сделала бы CC перед запуском собственно компилятора. Для включения\n";
echo "файлов из стандартной директории включения вместо кавычек используются угловые\n";
echo "скобки &lt; и &gt;. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-top:13.3pt;margin-right:10.55pt;\n";
echo "margin-bottom:0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:center;\n";
echo "text-autospace:none'>#include &lt;stream.h&gt;  //из стандартной директории\n";
echo "включения</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>#define &quot;myheader.h&quot;\n";
echo "// из текущей директории</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Использование &lt;&gt; имеет то преимущество, что в\n";
echo "программу фактическое имя директории включения не встраивается (как правило,\n";
echo "сначала просматривается /usr/include/CC, а потом usr /include). К сожалению,\n";
echo "пробелы в директиве include сущест­венны:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include &lt;\n";
echo "stream.h &gt; // </span>не найдет<span lang=EN-US> &lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Может показаться, что перекомпилировать файл заново\n";
echo "каж­дый раз, когда он куда-либо включается, расточительно, но время компиляции\n";
echo "такого файла обычно слабо отличается от вре­мени, которое необходимо для чтения\n";
echo "его некоторой заранее от­компилированной формы. Причина в том, что текст\n";
echo "программы яв­ляется довольно компактным представлением программы, и в том, что\n";
echo "включаемые файлы обычно содержат только описания и не со­держат программ,\n";
echo "требующих от компилятора значительного ана­лиза.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Следующее эмпирическое правило относительно того, что\n";
echo "следует, а что не следует помещать в заголовочные файлы, яв­ляется не\n";
echo "требованием языка, а просто предложением по разум­ному использованию аппарата\n";
echo "#include.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>В заголовочном файле могут\n";
echo "содержаться:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Определения\n";
echo "типов struct point (* int x, y; *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:13.2pt;text-autospace:\n";
echo "none'>Описания функций extern int strlen(const char*); Определения\n";
echo "inline-функ-й inline char get()(*return *p++;*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Описания\n";
echo "данных extern int a;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Определения\n";
echo "констант const float pi = 3.141593</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Перечисления<span\n";
echo "lang=EN-US> enum bool (* false, true *);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Директивы<span\n";
echo "lang=EN-US> include #include &lt;signal.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Определения макросов<span\n";
echo "lang=EN-US> #define Case break;case</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:26.4pt;text-autospace:none'>Комментарии /* проверка на конец\n";
echo "файла */</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>но никогда:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Определения\n";
echo "обычных функций char get() (* return *p++; *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Определения\n";
echo "данных int a;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:26.4pt;margin-bottom:.0001pt;text-autospace:none'>Определения\n";
echo "сложных константных объектов const tbl[]=(*/*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:26.4pt;text-autospace:none'>... */ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В системе UNIX принято, что заголовочные файлы\n";
echo "имеют суффикс (расширение) .h. Файлы, содержащие определение данных или\n";
echo "функций, должны иметь суффикс .c. Такие файлы часто назы­вают, соответственно,\n";
echo "&quot;.h файлы&quot; и &quot;.c файлы&quot;. В #4.7 описы­ваются макросы.\n";
echo "Следует заметить, что в С++ макросы гораздо менее полезны, чем в C, поскольку\n";
echo "С++ имеет такие языковые конструкции, как const для определения констант и\n";
echo "inline для исключения расходов на вызов функции.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Причина того, почему в заголовочных файлах допускается\n";
echo "определение простых констант, но не допускается определение сложных константных\n";
echo "объектов, прагматическая. В принципе, сложность тут только в том, чтобы сделать\n";
echo "допустимым дублиро­вание определений переменных (даже определения функций можно\n";
echo "было бы дублировать). Однако для компоновщиков старого образ­ца слишком трудно\n";
echo "проверять тождественность нетривиальных констант и убирать ненужные повторы.\n";
echo "Кроме того, простые слу­чаи гораздо более обиходны и потому более важны для\n";
echo "генерации хорошего кода.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967974\">4.3.1 Один Заголовочный Файл</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Проще всего решить проблему разбиения программы на\n";
echo "нес­колько файлов поместив функции и определения данных в подхо­дящее число\n";
echo "исходных файлов и описав типы, необходимые для их взаимодействия, в одном\n";
echo "заголовочном файле, который включает­ся во все остальные файлы. Для программы\n";
echo "калькулятора можно использовать четыре .c файла: lex.c, syn.c, table.c и\n";
echo "main.c, и заголовочный файл dc.h, содержащий описания всех имен, ко­торые\n";
echo "используются более чем в одном .c файле:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// dc.h: общие описания для\n";
echo "калькулятора</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>enum token_value (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>NAME, NUMBER, END,</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>PLUS='+', MINUS='-', MUL='*', DIV='/',</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>PRINT=';', ASSIGN='=', LP='(', RP=')'</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern int no_of_errors;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double error(char* s);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern token_value get_token();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern token_value curr_tok;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double number_value;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern char\n";
echo "name_string[256];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double expr();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double term();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern double\n";
echo "prim();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct name (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* string;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>name* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double value;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern name* look(char* p, int ins = 0);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>inline name* insert(char*\n";
echo "s) (* return look(s,1); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Если опустить фактический код, то lex.c будет\n";
echo "выглядеть примерно так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>// lex.c:\n";
echo "ввод и лексический анализ</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;dc.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;ctype.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>token_value curr_tok;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double number_value;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>char\n";
echo "name_string[256];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>token_value\n";
echo "get_token() (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что такое использование заголовочных\n";
echo "файлов гарантирует, что каждое описание в заголовочном файле объек­та,\n";
echo "определенного пользователем, будет в какой-то момент включено в файл, где он\n";
echo "определяется. Например, при компиля­ции lex.c компилятору будет передано:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern token_value get_token();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>token_value\n";
echo "get_token() (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это обеспечивает то, что компилятор обнаружит любую\n";
echo "не­согласованность в типах, указанных для имени. Например, если бы get_token()\n";
echo "была описана как возвращающая token_value, но при этом определена как\n";
echo "возвращающая int, компиляция lex.c не прошла бы изза ошибки несоответствия\n";
echo "типов.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Файл syn.c будет выглядеть\n";
echo "примерно так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// syn.c: синтаксический анализ\n";
echo "и вычисление</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;dc.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double prim() (* /* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double term() (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>double expr() (* /* ... */ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Файл table.c будет выглядеть\n";
echo "примерно так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// table.c: таблица имен и\n";
echo "просмотр</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;dc.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern char* strcmp(const char*, const char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern char* strcpy(char*, const char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern int\n";
echo "strlen(const char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>const TBLSZ = 23;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>name*\n";
echo "table[TBLSZ];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>name*\n";
echo "look(char* p; int ins) (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что table.c сам описывает стандартные\n";
echo "функции для работы со строками, поэтому никакой проверки согласован­ности этих\n";
echo "описаний нет. Почти всегда лучше включать заголо­вочный файл, чем описывать имя\n";
echo "в .c файле как extern. При этом может включаться &quot;слишком много&quot;, но\n";
echo "это обычно не ока­зывает серьезного влияния на время, необходимое для компиля­ции,\n";
echo "и как правило экономит время программиста. В качестве примера этого, обратите\n";
echo "внимание на то, как strlen() заново описывается в main() (ниже). Это лишние\n";
echo "нажатия клавиш и воз­можный источник неприятностей, поскольку компилятор не\n";
echo "может проверить согласованность этих двух определений. На самом де­ле, этой\n";
echo "сложности можно было бы избежать, будь все описания extern помещены в dc.h, как\n";
echo "и предлагалось сделать. Эта &quot;неб­режность&quot; сохранена в программе,\n";
echo "поскольку это очень типично для C программ, очень соблазнительно для\n";
echo "программиста, и чаще приводит, чем не приводит, к ошибкам, которые трудно\n";
echo "обнару­жить, и к программам, с которыми тяжело работать. Вас предуп­редили!</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>И main.c, наконец, выглядит так:</p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-top:0cm;margin-right:10.55pt;\n";
echo "margin-bottom:13.3pt;margin-left:0cm;text-align:center;text-autospace:none'>//\n";
echo "main.c: инициализация, главный цикл и обработка ошибок</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;dc.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>int\n";
echo "no_of_errors;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>double\n";
echo "error(char* s) (* /* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern int\n";
echo "strlen(const char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>main(int argc,\n";
echo "char* argv[]) (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Важный случай, когда размер заголовочных файлов\n";
echo "стано­вится серьезной помехой. Набор заголовочных файлов и библиотеку можно\n";
echo "использовать для расширения языка множеством обще- и специальноприкладных типов\n";
echo "(см. Главы 5-8). В таких случаях не принято осуществлять чтение тысяч строк\n";
echo "заголовоч­ных файлов в начале каждой компиляции. Содержание этих файлов обычно\n";
echo "&quot;заморожено&quot; и изменяется очень нечасто. Наиболее по­лезным может\n";
echo "оказаться метод затравки компилятора содержанием этих заголовочных фалов. По\n";
echo "сути, создается язык специального назначения со своим собственным компилятором.\n";
echo "Никакого стан­дартного метода создания такого компилятора с затравкой не\n";
echo "принято.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967975\">4.3.2 Множественные Заголовочные Файлы</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Стиль разбиения программы с одним заголовочным\n";
echo "файлом наиболее пригоден в тех случаях, когда программа невелика и ее части не\n";
echo "предполагается использовать отдельно. Поэтому то, что невозможно установить,\n";
echo "какие описания зачем помещены в заголовочный файл, несущественно. Помочь могут\n";
echo "комментарии. Другой способ - сделать так, чтобы каждая часть программы имела\n";
echo "свой заголовочный файл, в котором определяются предос­тавляемые этой частью\n";
echo "средства. Тогда каждый .c файл имеет соответствующий .h файл, и каждый .c файл\n";
echo "включает свой собс­твенный (специфицирующий то, что в нем задается) .h файл и,\n";
echo "возможно, некоторые другие .h файлы (специфицирующие то, что ему нужно).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Рассматривая организацию калькулятора, мы замечаем, что\n";
echo "error() используется почти каждой функцией программы, а сама использует только\n";
echo "&lt;stream.h&gt;. Это обычная для функции ошибок ситуация, поэтому error()\n";
echo "следует отделить от main():</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// error.h: обработка ошибок</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern int\n";
echo "no_errors;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern double\n";
echo "error(char* s);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>// error.c</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;error.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>int\n";
echo "no_of_errors;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>double\n";
echo "error(char* s) (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>При таком стиле использования заголовочных файлов\n";
echo ".h файл и связанный с ним .c файл можно рассматривать как мо­дуль, в котором .h\n";
echo "файл задает интерфейс, а .c файл задает реализацию.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Таблица символов не зависит от остальной части\n";
echo "калькуля­тора за исключением использования функции ошибок. Это можно сделать\n";
echo "явным:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// table.h: описания таблицы\n";
echo "имен</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>struct name (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* string;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>name* next;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double value;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern name* look(char* p, int ins = 0);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>inline name*\n";
echo "insert(char* s) (* return look(s,1); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// table.c: определения таблицы\n";
echo "имен</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;error.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;string.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;table.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>const TBLSZ = 23;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>name*\n";
echo "table[TBLSZ];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>name*\n";
echo "look(char* p; int ins) (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что описания функций работы со строками\n";
echo "теперь включаются из &lt;string.h&gt;. Это исключает еще один возможный\n";
echo "источник ошибок.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// lex.h: описания для ввода и\n";
echo "лексического анализа</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>enum token_value (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>NAME, NUMBER, END,</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>PLUS='+', MINUS='-', MUL='*', DIV='/',</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>PRINT=';', ASSIGN='=', LP='(', RP=')'</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern token_value curr_tok;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double number_value;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern char\n";
echo "name_string[256];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern\n";
echo "token_value get_token();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Этот интерфейс лексического анализатора достаточно\n";
echo "бес­порядочен. Недостаток в надлежащем типе лексемы обнаруживает себя в\n";
echo "необходимости давать пользователю get_token() факти­ческие лексические буферы\n";
echo "number_value и name_string.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// lex.c: определения для ввода\n";
echo "и лексического анализа</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;ctype.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;error.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;lex.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>token_value curr_tok;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double number_value;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>char\n";
echo "name_string[256];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>token_value\n";
echo "get_token() (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Интерфейс синтаксического анализатора совершенно прозра­чен:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// syn.c: описания для\n";
echo "синтаксического анализа и вычисления</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double expr();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double term();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern double\n";
echo "prim();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>// syn.c:\n";
echo "определения для синтаксического анализа и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>// </span>вычисления</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;error.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;lex.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;syn.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double prim() (* /* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double term() (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>double expr() (* /* ... */ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Главная программа, как всегда,\n";
echo "тривиальна:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// main.c: главная программа</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;stream.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;error.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;lex.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;syn.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;table.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&lt;string.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>main(int argc,\n";
echo "char* argv[]) (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Сколько заголовочных файлов использовать в\n";
echo "программе, зависит от многих факторов. Многие из этих факторов сильнее связаны\n";
echo "с тем, как ваша система работает с заголовочными фай­лами, нежели с С++.\n";
echo "Например, если в вашем редакторе нет средств, позволяющих одновременно видеть\n";
echo "несколько файлов, использование большого числа файлов становится менее привле­кательным.\n";
echo "Аналогично, если открывание и чтение 10 файлов по 50 строк в каждом требует\n";
echo "заметно больше времени, чем чтение одного файла в 500 строк, вы можете дважды\n";
echo "подумать, прежде чем использовать в небольшом проекте стиль множественных за­головочных\n";
echo "файлов. Слово предостережения: набор из десяти за­головочных файлов плюс\n";
echo "стандартные заголовочные файлы обычно легче поддаются управлению. С другой\n";
echo "стороны, если вы разбили описания в большой программе на логически минимальные\n";
echo "по раз­меру заголовочные файлы (помещая каждое описание структуры в свой\n";
echo "отдельный файл и т.д.), у вас легко может получиться не­разбериха из сотен\n";
echo "файлов.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967976\">4.3.3 Сокрытие Данных</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Используя заголовочные файлы пользователь может\n";
echo "опреде­лять явный интерфейс, чтобы обеспечить согласованное исполь­зование\n";
echo "типов в программе. С другой стороны, пользователь может обойти интерфейс,\n";
echo "задаваемый заголовочным файлом, вводя в .c файлы описания extern.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Заметьте, что такой стиль\n";
echo "компоновки не рекомендуется:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>// file1.c:\n";
echo "// &quot;extern&quot; не используется</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int a = 7;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>const c = 8;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>void f(long) (*\n";
echo "/* ... */ *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// file2.c: // &quot;extern&quot; </span>в<span lang=EN-US> .c </span>файле</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern int a;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern const c;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern f(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:39.6pt;text-autospace:none'><span lang=EN-US>int g() (*\n";
echo "return f(a+c); *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Поскольку описания extern в file2.c не включаются\n";
echo "вместе с определениями в файле file1.c, компилятор не может прове­рить\n";
echo "согласованность этой программы. Следовательно, если только загрузчик не\n";
echo "окажется гораздо сообразительнее средне­го, две ошибки в этой программе\n";
echo "останутся, и их придется ис­кать программисту.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Пользователь может защитить файл от такой недисциплини­рованной\n";
echo "компоновки, описав имена, которые не предназначены для общего пользования, как\n";
echo "static, чтобы их областью види­мости был файл, и они были скрыты от остальных\n";
echo "частей прог­раммы. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>// table.c: определения таблицы\n";
echo "имен</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &quot;error.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>#include &lt;string.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>#include\n";
echo "&quot;table.h&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>const TBLSZ = 23;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>static name*\n";
echo "table[TBLSZ];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>name*\n";
echo "look(char* p; int ins) (* /* ... </span>*/ *)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это гарантирует, что любой доступ к table\n";
echo "действительно будет осуществляться именно через look(). &quot;Прятать&quot;\n";
echo "константу TBLSZ не обязательно.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219967977\">4.4 Файлы как Модули</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>В предыдущем разделе .c и .h файлы вместе\n";
echo "определяли часть программы. Файл .h является интерфейсом, который ис­пользуют\n";
echo "другие части программы, .c файл задает реализацию. Такой объект часто называют\n";
echo "модулем. Доступными делаются только те имена, которые необходимо знать\n";
echo "пользователю, ос­тальные скрыты. Это качество часто называют сокрытием данных,\n";
echo "хотя данные - лишь часть того, что может быть скрыто. Модули такого вида\n";
echo "обеспечивают большую гибкость. Например, реализа­ция может состоять из одного\n";
echo "или более .c файлов, и в виде .h файлов может быть предоставлено несколько\n";
echo "интерфейсов. Инфор­мация, которую пользователю знать не обязательно, искусно\n";
echo "скрыта в .c файлах. Если важно, что пользователь не должен точно знать, что\n";
echo "содержится в .c файлах, не надо делать их доступными в исходом виде. Достаточно\n";
echo "эквивалентных им выход­ных файлов компилятора (.o файлов).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Иногда возникает сложность, состоящая в том, что подоб­ная\n";
echo "гибкость достигается без формальной структуры. Сам язык не распознает такой\n";
echo "модуль как объект, и у компилятора нет возможности отличить .h файлы,\n";
echo "определяющие имена, которые должны использовать другие модули (экспортируемые),\n";
echo "от .h файлов, которые описывают имена из других модулей (импортиру­емые).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>В других случаях может возникнуть та проблема, что мо­дуль\n";
echo "определяет множество объектов, а не новый тип. Например, модуль table\n";
echo "определяет одну таблицу, и если вам нужно две таблицы, то нет простого способа\n";
echo "задать вторую таблицу с по­мощью понятия модуля. Решение этой проблемы\n";
echo "приводится в Гла­ве 5.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Каждый статически размещенный объект по умолчанию иници­ализируется\n";
echo "нулем, программист может задать другие (константные) значения. Это только самый\n";
echo "примитивный вид ини­циализации. К счастью, с помощью классов можно задать код,\n";
echo "который выполняется для инициализации перед тем, как модуль какимлибо образом\n";
echo "используется, и/или код, который запускает­ся для очистки после последнего\n";
echo "использования модуля, см. #5.5.2.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219967978\">4.5 Как Создать Библиотеку</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Фразы типа &quot;помещен в библиотеку&quot; и\n";
echo "&quot;ищется в какой-то библиотеке&quot; используются часто (и в этой книге, и\n";
echo "в других), но что это означает для С++ программы? К сожалению, ответ за­висит\n";
echo "от того, какая операционная система используется; в этом разделе объясняется,\n";
echo "как создать библиотеку в 8-ой вер­сии системы UNIX. Другие системы\n";
echo "предоставляют аналогичные возможности.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Библиотека в своей основе является множеством .o файлов,\n";
echo "полученных в результате компиляции соответствующего множества .c файлов. Обычно\n";
echo "имеется один или более .h файлов, в которых содержатся описания для\n";
echo "использования этих .o файлов. В ка­честве примера рассмотрим случай, когда нам\n";
echo "надо задать (обычным способом) набор математических функций для некоторо­го\n";
echo "неопределенного множества пользователей. Заголовочный файл мог бы выглядеть\n";
echo "примерно так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double sqrt(double); // </span>подмножество<span lang=EN-US>\n";
echo "&lt;math.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double sin(double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double cos(double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double exp(double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern double\n";
echo "log(double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>а определения этих функций хранились бы, соответственно, в файлах sqrt.c,\n";
echo "sin.c, cos.c, exp.c и log.c.</p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-top:13.3pt;margin-right:10.55pt;\n";
echo "margin-bottom:13.3pt;margin-left:0cm;text-align:center;text-autospace:none'>Библиотеку\n";
echo "с именем math.h можно создать, например, так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>$ CC -c\n";
echo "sqrt.c sin.c cos.c exp.c log.c</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>$ ar cr math.a sqrt.o sin.o cos.o exp.o log.o</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>$ ranlib math.a</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Вначале исходные файлы компилируются в\n";
echo "эквивалентные им объектные файлы. Затем используется команда ar, чтобы создать\n";
echo "архив с именем math.a. И, наконец, этот архив индексируется для ускорения\n";
echo "доступа. Если в вашей системе нет ranlib коман­ды, значит она вам, вероятно, не\n";
echo "понадобится. Подробности посмотрите, пожалуйста, в вашем руководстве в разделе\n";
echo "под за­головком ar. Использовать библиотеку можно, например, так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>$ CC myprog.c\n";
echo "math.a</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Теперь разберемся, в чем же преимущества\n";
echo "использования math.a перед просто непосредственным использованием .o фай­лов?\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>$ CC myprog.c sqrt.o sin.o cos.o\n";
echo "exp.o log.o</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Для большинства программ определить правильный\n";
echo "набор .o файлов, несомненно, непросто. В приведенном выше примере они\n";
echo "включались все, но если функции в myprog.c вызывают только функции sqrt() и\n";
echo "cos(), то кажется, что будет достаточно</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>$ CC myprog.c\n";
echo "sqrt.o cos.o</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>Но это не так, поскольку cos.c\n";
echo "использует sin.c.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Компоновщик, вызываемый командой CC для обработки\n";
echo ".a файла (в данном случае, файла math.a) знает, как из того мно­жества, которое\n";
echo "использовалось для создания .a файла, извлечь только необходимые .o файлы.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Другими словами, используя библиотеку можно включать много\n";
echo "определений с помощью одного имени (включения определе­ний функций и\n";
echo "переменных, используемых внутренними функциями, никогда не видны пользователю),\n";
echo "и, кроме того, обеспечить, что в результате в программу будет включено\n";
echo "минимальное коли­чество определений.</p>\n";
echo "\n";
echo "<h2><a name=\"_Toc219967979\">4.6 Функции</a></h2>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Обычный способ сделать что-либо в С++ программе -\n";
echo "это вызвать функцию, которая это делает. Определение функции яв­ляется способом\n";
echo "задать то, как должно делаться некоторое действие. Функция не может быть\n";
echo "вызвана, пока она не описана.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967980\">4.6.1 Описания Функций</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Описание функции задает имя функции, тип\n";
echo "возвращаемого функцией значения (если таковое есть) и число и типы парамет­ров,\n";
echo "которые должны быть в вызове функции. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern double sqrt(double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern elem* next_elem();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern char* strcpy(char* to, const char* from);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern void\n";
echo "exit(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Семантика передачи параметров идентична семантике иници­ализации. Проверяются\n";
echo "типы параметров, и когда нужно произво­дится неявное преобразование типа.\n";
echo "Например, если были заданы предыдущие определения, то</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>double sr2 =\n";
echo "sqrt(2);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>будет правильно обращаться к функции sqrt() со значением с плавающей\n";
echo "точкой 2.0. Значение такой проверки типа и преоб­разования типа огромно.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Описание функции может содержать имена параметров. Это\n";
echo "может помочь читателю, но компилятор эти имена просто игнори­рует.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967981\">4.6.2 Определения Функций</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Каждая функция, вызываемая в программе, должна быть\n";
echo "где­то определена (только один раз). Определение функции - это описание\n";
echo "функции, в котором приводится тело функции. Напри­мер:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>extern void swap(int*, int*); //\n";
echo "описание</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>void\n";
echo "swap(int*, int*) // определение</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int t = *p;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*p =*q;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>*q = t;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Чтобы избежать расходов на вызов функции, функцию\n";
echo "можно описать как inline (#1.12), а чтобы обеспечить более быстрый доступ к\n";
echo "параметрам, их можно описать как register (#2.3.11). Оба средства могут\n";
echo "использоваться неправильно, и их следует избегать везде где есть какие-либо\n";
echo "сомнения в их полезности.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967982\">4.6.3 Передача Параметров</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Когда вызывается функция, дополнительно выделяется\n";
echo "па­мять под ее формальные параметры, и каждый формальный пара­метр\n";
echo "инициализируется соответствующим ему фактическим пара­метром. Семантика\n";
echo "передачи параметров идентична семантике инициализации. В частности, тип\n";
echo "фактического параметра сопос­тавляется с типом формального параметра, и\n";
echo "выполняются все стандартные и определенные пользователем преобразования ти­пов.\n";
echo "Есть особые правила для передачи векторов (#4.6.5), средство передавать\n";
echo "параметр без проверки типа параметра (#4.6.8) и средство для задания параметров\n";
echo "по умолчанию <span lang=EN-US>(#4.6.6). </span>Рассмотрим</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f(int val, int&amp; ref)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>val++;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>ref++;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Когда вызывается f(), val++ увеличивает локальную\n";
echo "копию первого фактического параметра, тогда как ref++ увеличивает второй\n";
echo "фактический параметр. Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>int i = 1;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int j = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>f(i,j);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>увеличивает j, но не i. Первый параметр - i,\n";
echo "передается по значению, второй параметр - j, передается по ссылке. Как уже\n";
echo "отмечалось в #2.3.10, использование функций, которые из­меняют переданные по\n";
echo "ссылке параметры, могут сделать програм­му трудно читаемой, и их следует\n";
echo "избегать (но см. #6.5 и #8.4). Однако передача большого объекта по ссылке может\n";
echo "быть гораздо эффективнее, чем передача его по значению. В этом случае параметр\n";
echo "можно описать как const, чтобы указать, что ссылка применяется по соображениям\n";
echo "эффективности, а также чтобы не позволить вызываемой функции изменять значение\n";
echo "объ­екта:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f(const large&amp; arg)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// значение\n";
echo "&quot;arg&quot; не может быть изменено</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>Аналогично, описание параметра указателя как const сооб­щает читателю,\n";
echo "что значение объекта, указываемого указателем, функцией не изменяется. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern int strlen(const char*); // </span>из<span lang=EN-US>\n";
echo "&lt;string.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>extern char* strcpy(char* to, const char* from);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern int\n";
echo "strcmp(const char*, const char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-top:0cm;margin-right:10.55pt;\n";
echo "margin-bottom:13.3pt;margin-left:0cm;text-align:center;text-autospace:none'>Важность\n";
echo "такой практики возрастает с размером программы.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что семантика передачи параметров отлична\n";
echo "от семантики присваивания. Это важно для const параметров, ссы­лочных\n";
echo "параметров и параметров некоторых типов, определяемых пользователем (#6.6).</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967983\">4.6.4 Возврат Значения</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Из функции, которая не описана как void, можно (и\n";
echo "долж­но) возвращать значение. Возвращаемое значение задается опе­ратором\n";
echo "return. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>int fac(int n)\n";
echo "(*return (n&gt;1) ? n*fac(n-1) : 1; *)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-indent:-13.2pt;text-autospace:\n";
echo "none'>В функции может быть больше одного оператора return: int fac(int n)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>if (n &gt; 1)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>return n*fac(n-1);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>else</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>return 1;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:58.05pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Как и семантика передачи параметров, семантика\n";
echo "возврата функцией значения идентична семантике инициализации. Возвра­щаемое\n";
echo "значение рассматривается как инициализатор переменной возвращаемого типа. Тип\n";
echo "возвращаемого выражения проверяется на согласованность с возвращаемым типом и\n";
echo "выполняются все стандартные и определенные пользователем преобразования ти­пов.\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>double f()</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>return 1; //\n";
echo "неявно преобразуется к double(1)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Каждый раз, когда вызывается функция, создается\n";
echo "новая копия ее параметров и автоматических переменных. После возв­рата из\n";
echo "функции память используется заново, поэтому возвра­щать указатель на локальную\n";
echo "переменную неразумно. Содержание указываемого места изменится непредсказуемо:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int* f() (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int local = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>return\n";
echo "&amp;local; // так не делайте</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Эта ошибка менее обычна, чем эквивалентная ошибка\n";
echo "при использовании ссылок:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int&amp; f() (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int local = 1;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>// ...</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>return local;\n";
echo "// так не делайте</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>К счастью, о таких возвращаемых значениях\n";
echo "предупреждает компилятор. Вот другой пример:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>int&amp; f() (* return 1;*) //\n";
echo "так не делайте</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967984\">4.6.5 Векторные Параметры</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Если в качестве параметра функции используется\n";
echo "вектор, то передается указатель на его первый элемент. Например<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>int\n";
echo "strlen(const char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f()</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char v[] = &quot;a vector&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strlen(v);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>strlen(&quot;Nicholas&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Иначе говоря, при передаче как параметр параметр\n";
echo "типа T[] преобразуется к T*. Следовательно, присваивание элементу векторного\n";
echo "параметра изменяет значение элемента вектора, ко­торый является параметром.\n";
echo "Другими словами, вектор отличается от всех остальных типов тем, что вектор не\n";
echo "передается (и не может передаваться) по значению.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Размер вектора недоступен вызываемой функции. Это может\n";
echo "быть неудобно, но эту сложность можно обойти несколькими спо­собами. Строки\n";
echo "оканчиваются нулем, поэтому их размер можно легко вычислить. Для других\n";
echo "векторов можно передавать второй параметр, который задает размер, или\n";
echo "определить тип, содержа­щий указатель и индикатор длины, и передавать его\n";
echo "вместо просто вектора (см. также #1.11). Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal align=center style='margin-top:13.3pt;margin-right:10.55pt;\n";
echo "margin-bottom:13.3pt;margin-left:0cm;text-align:center;text-autospace:none'><span\n";
echo "lang=EN-US>void compute1(int* vec_ptr, int vec_size); // </span>один способ</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>struct vec (*\n";
echo "// другой способ</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int* ptr;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int size;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>void\n";
echo "compute2(vec v);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>С многомерными массивами все хитрее, но часто можно\n";
echo "вместо них использовать векторы указателей, которые не требу­ют специального\n";
echo "рассмотрения. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>char* day[] = (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>&quot;mon&quot;, &quot;tue&quot;, &quot;wed&quot;, &quot;thu&quot;,\n";
echo "&quot;fri&quot;, &quot;sat&quot;, &quot;sun&quot;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>С другой стороны, рассмотрим определение функции,\n";
echo "кото­рая работает с двумерными матрицами. Если размерность извест­на на стадии\n";
echo "компиляции, то никаких проблем нет:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_m34(int m[3][4])</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i = 0; i&lt;3; i++) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int j = 0; j&lt;4; j++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot; &quot; &lt;&lt; m[i][j];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>cout &lt;&lt;\n";
echo "&quot;\n&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Матрица, конечно, все равно передается как\n";
echo "указатель, а размерности используются просто для удобства записи.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>Первая размерность массива не имеет отношения к задаче\n";
echo "поиска положения элемента (#2.3.6). Поэтому ее можно переда­вать как параметр:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_mi4(int m[][4], int dim1)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i = 0; i&lt;dim1; i++) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int j = 0; j&lt;4; j++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot; &quot; &lt;&lt; m[i][j];</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>cout &lt;&lt;\n";
echo "&quot;\n&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Сложный случай возникает, когда нужно передавать\n";
echo "обе размерности. &quot;Очевидное решение&quot; просто не работает:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_mij(int m[][], int dim1, int dim2) // </span>ошибка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i = 0; i&lt;dim1; i++) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int j = 0; j&lt;dim2; j++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:92.4pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>cout &lt;&lt; &quot; &quot; &lt;&lt; m[i][j]; // </span>сюрприз<span\n";
echo "lang=EN-US>!</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'>cout &lt;&lt;\n";
echo "&quot;\n&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Во-первых, описание параметра m[][] недопустимо,\n";
echo "пос­кольку для нахождения положения элемента должна быть известна вторая\n";
echo "размерность многомерного массива. Во-вторых, выражение m[i][j] интерпретируется\n";
echo "(правильно) как *(*(m+i)+j), но не­похоже, чтобы это имел в виду программист.\n";
echo "Вот правильное ре­шение:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print_mij(int** m, int dim1, int dim2)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int i = 0; i&lt;dim1; i++) (*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>for (int j = 0; j&lt;dim2; j++)</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:66.0pt;margin-bottom:.0001pt;text-indent:26.4pt;text-autospace:\n";
echo "none'><span lang=EN-US>cout &lt;&lt; &quot; &quot; &lt;&lt; (int*)m[i*dim2+j];\n";
echo "// </span>туманно<span lang=EN-US> cout &lt;&lt; &quot;\n&quot;;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Выражение, которое применяется для доступа к\n";
echo "элементам, эквивалентно тому, которое генерирует компилятор, когда он знает\n";
echo "последнюю размерность. Чтобы немного прояснить програм­му, можно ввести\n";
echo "дополнительную переменную:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int* v = (int*)m;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>// ...</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>v[i*dim2+j]</span></p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967985\">4.6.6 Параметры по Умолчанию</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Часто в самом общем случае функции требуется больше\n";
echo "па­раметров, чем в самом простом и более употребительном случае. Например, в\n";
echo "библиотеке потоков есть функция hex(), порождаю­щая строку с шестнадцатиричным\n";
echo "представлением целого. Второй параметр используется для задания числа символов\n";
echo "для предс­тавления первого параметра. Если число символов слишком мало для\n";
echo "представления целого, происходит усечение, если оно слиш­ком велико, то строка\n";
echo "дополняется пробелами. Часто програм­мист не заботится о числе символов,\n";
echo "необходимых для представ­ления целого, поскольку символов достаточно. Поэтому\n";
echo "для нуля в качестве второго параметра определено значение &quot;использо­вать\n";
echo "столько символов, сколько нужно&quot;. Чтобы избежать засоре­ния программы\n";
echo "вызовами вроде hex(i,0), функция описывается так:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>extern char*\n";
echo "hex(long, int =0);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Инициализатор второго параметра является параметром\n";
echo "по умолчанию. То есть, если в вызове дан только один параметр, в качестве\n";
echo "второго используется параметр по умолчанию. Напри­мер:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>cout &lt;&lt; &quot;**&quot;\n";
echo "&lt;&lt; hex(31) &lt;&lt; hex(32,3) &lt;&lt; &quot;**&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>интерпретируется как</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>cout &lt;&lt; &quot;**&quot;\n";
echo "&lt;&lt; hex(31,0) &lt;&lt; hex(32,3) &lt;&lt; &quot;**&quot;;</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:0cm;text-autospace:none'>и напечатает:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>** 1f 20**</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Параметр по умолчанию проходит проверку типа во\n";
echo "время описания функции и вычисляется во время ее вызова. Задавать параметр по\n";
echo "умолчанию возможно только для последних парамет­ров, поэтому</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int f(int, int =0, char* =0); // ok</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int g(int =0, int =0, char*); // </span>ошибка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>int f(int =0,\n";
echo "int, char* =0); // </span>ошибка</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Заметьте, что в этом контексте пробел между * и =\n";
echo "явля­ется существенным (*= является операцией присваивания):</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>int\n";
echo "nasty(char*=0); // синтаксическая ошибка</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967986\">4.6.7 Перегрузка Имен Функций</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Как правило, давать разным функциям разные имена -\n";
echo "мысль хорошая, но когда некоторые функции выполняют одинаковую ра­боту над\n";
echo "объектами разных типов, может быть более удобно дать им одно и то же имя.\n";
echo "Использование одного имени для различных действий над различными типами\n";
echo "называется перегрузкой (overloading). Метод уже используется для основных\n";
echo "операций С ++: у сложения существует только одно имя, +, но его можно применять\n";
echo "для сложения значений целых, плавающих и указатель­ных типов. Эта идея легко\n";
echo "расширяется на обработку операций, определенных пользователем, то есть,\n";
echo "функций. Чтобы уберечь программиста от случайного повторного использования\n";
echo "имени, имя может использоваться более чем для одной функции только если оно\n";
echo "сперва описано как перегруженное имя функции. Напри<span lang=EN-US>­</span>мер<span\n";
echo "lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>overload print;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void print(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>void\n";
echo "print(char*);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Что касается компилятора, единственное общее, что\n";
echo "имеют функции с одинаковым именем, это имя. Предположительно, они в каком-то\n";
echo "смысле похожи, но в этом язык ни стесняет програм­миста, ни помогает ему. Таким\n";
echo "образом, перегруженные имена функций - это главным образом удобство записи. Это\n";
echo "удобство значительно в случае функций с общепринятыми именами вроде sqrt, print\n";
echo "и open. Когда имя семантически значимо, как это имеет место для операций вроде\n";
echo "+, * и &lt;&lt; (#6.2) и в случае конструкторов (#5.2.4 и #6.3.1), это удобство\n";
echo "становится су­щественным. Когда вызывается перегруженная f(), компилятор должен\n";
echo "понять, к какой из функций с именем f следует обра­титься. Это делается путем\n";
echo "сравнения типов фактических пара­метров с типами формальных параметров всех\n";
echo "функций с именем f. Поиск функции, которую надо вызвать, осуществляется за три\n";
echo "отдельных шага:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-indent:33.0pt;text-autospace:\n";
echo "none'>[1] Искать функцию соответствующую точно, и использовать ее, если она\n";
echo "найдена,</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>[2] Искать соответствующую функцию используя встроенные\n";
echo "преобразования и использовать любую найденную функцию и</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>[3] Искать соответствующую функцию используя преобразо­вания,\n";
echo "определенные пользователем (#6.3), и если множество преобразований единственно,\n";
echo "использовать найденную функцию.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>overload\n";
echo "print(double), print(int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f();</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>(*</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>print(1);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>print(1.0);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Правило точного соответствия гарантирует, что f\n";
echo "напеча­тает 1 как целое и 1.0 как число с плавающей точкой. Ноль, char или\n";
echo "short точно соответствуют параметру. Аналогично, float точно соответствует double.</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>К параметрам функций с перегруженными именами стандарт­ные\n";
echo "С++ правила неявного преобразования типа (#с.6.6) приме­няются не полностью.\n";
echo "Преобразования, могущие уничтожить ин­формацию, не выполняются. Остаются int в\n";
echo "long, int в double, ноль в long, ноль в double и преобразования указателей: пре­образование\n";
echo "ноль в указатель void*, и указатель на производ­ный класс в указатель на\n";
echo "базовый класс (#7.2.4).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>Вот пример, в котором\n";
echo "преобразование необходимо:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>overload\n";
echo "print(double), print(long);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>void f(int a);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'>(*</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:39.6pt;margin-bottom:.0001pt;text-autospace:none'>print(a);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>*)</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Здесь a может быть напечатано или как double, или\n";
echo "как long. Неоднозначность разрешается явным преобразованием типа (или\n";
echo "print(long(a)) или print(double(a))).</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:0cm;margin-bottom:.0001pt;text-align:justify;text-indent:33.0pt;\n";
echo "text-autospace:none'>При этих правилах можно гарантировать, что когда эффек­тивность\n";
echo "или точность вычислений для используемых типов су­щественно различаются, будет\n";
echo "использоваться простейший алго­ритм (функция). Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>overload pow;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>int pow(int, int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>double pow(double, double); // </span>из<span lang=EN-US>\n";
echo "&lt;math.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex pow(double, complex); // </span>из<span lang=EN-US>\n";
echo "&lt;complex.h&gt;</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex pow(complex, int);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>complex pow(complex, double);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>complex\n";
echo "pow(complex, complex);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Процесс поиска подходящей функции игнорирует\n";
echo "unsigned и const.</p>\n";
echo "\n";
echo "<h3><a name=\"_Toc219967987\">4.6.8 Незаданное Число Параметров</a></h3>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Для некоторых функций невозможно задать число и тип\n";
echo "всех параметров, которые можно ожидать в вызове. Такую функцию описывают\n";
echo "завершая список описаний параметров многоточием (...), что означает &quot;и\n";
echo "может быть, еще какие-то неописанные параметры&quot;. Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>int\n";
echo "printf(char* ...);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Это задает, что в вызове printf должен быть по\n";
echo "меньшей мере один параметр, char*, а остальные могут быть, а могут и не быть.\n";
echo "Например<span lang=EN-US>:</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:13.3pt;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>printf(&quot;Hello, world\n&quot;);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "0cm;margin-left:13.2pt;margin-bottom:.0001pt;text-autospace:none'><span\n";
echo "lang=EN-US>printf(&quot;</span>Мое имя<span lang=EN-US> %s %s\n&quot;,\n";
echo "first_name, second_name);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'><span lang=EN-US>printf(&quot;%d\n";
echo "+ %d = %d\n&quot;,2,3,5);</span></p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>Такая функция полагается на информацию, которая\n";
echo "недос­тупна компилятору при интерпретации ее списка параметров. В случае\n";
echo "printf() первым параметром является строка формата, содержащая специальные\n";
echo "последовательности символов, позволяю­щие printf() правильно обрабатывать\n";
echo "остальные параметры. %s означает &quot;жди параметра char*&quot;, а %d означает\n";
echo "&quot;жди параметра int&quot;. Однако, компилятор этого не знает, поэтому он не\n";
echo "может убедиться в том, что ожидаемые параметры имеют соответствую­щий тип.\n";
echo "Например:</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-top:0cm;margin-right:10.55pt;margin-bottom:\n";
echo "13.3pt;margin-left:13.2pt;text-autospace:none'>printf(&quot;Мое имя %s\n";
echo "%s\n&quot;,2);</p>\n";
echo "\n";
echo "<p class=MsoNormal style='margin-right:10.55pt;text-align:justify;text-indent:\n";
echo "33.0pt;text-autospace:none'>откомпилируется и в лучшем случае приведет к\n";
echo "какой-ни­будь странного вида выдаче.</p>\n";
echo "\n";
echo "<p class=MsoBodyText>Каждый вызов функции с автоматическим объектом  класса\n";
echo "включает по меньшей мере один вызов программ выделения и освобождения свободной\n";
echo "памяти. Это сделало бы также невозможным реализацию inline-функций чле­нов,\n";
echo "которые обращаются к данным закрытой части. Более того, такое изменение сделает\n";
echo "невозможным совместную компоновку C и С++ программ (поскольку C компилятор\n";
echo "обрабатывает struct не так, как это будет делать С++ компилятор). Для С++ это\n";
echo "было сочтено неприемлемым.</p>\n";
echo "\n";
?>
