Бьерн Страуструп - Язык программирования С++. Вступление, глава 1
Страница 28. Модули


 

1.3.6  Модули

    Программа С++ почти всегда состоит из нескольких раздельно
транслируемых "модулей". Каждый "модуль" обычно называется исходным
файлом, но иногда - единицей трансляции. Он состоит из последовательности
описаний типов, функций, переменных и констант. Описание extern позволяет
из одного исходного файла ссылаться на функцию или объект, определенные в
другом исходном файле. Например:

           extern "C" double sqrt ( double );
           extern ostream cout;

    Самый распространенный способ обеспечить согласованность описаний
внешних во всех исходных файлах - поместить такие описания в специальные
файлы, называемые заголовочными. Заголовочные файлы можно включать во все
исходные файлы, в которых требуются описания внешних. Например, описание
функции sqrt хранится в заголовочном файле стандартных математических
функций с именем math.h, поэтому, если нужно извлечь квадратный корень из
4, можно написать:

            #include <math.h>
            //...
            x = sqrt ( 4 );

    Поскольку стандартные заголовочные файлы могут включаться во многие
исходные файлы, в них нет описаний, дублирование которых могло бы вызвать
ошибки. Так, тело функции присутствует в таких файлах, если только это
функция-подстановка, а инициализаторы указаны только для констант ($$4.3).
Не считая таких случаев, заголовочный файл обычно служит хранилищем для
типов, он предоставляет интерфейс между раздельно транслируемыми частями
программы.

    В команде включения заключенное в угловые скобки имя файла (в нашем
примере - <math.h>) ссылается на файл, находящийся в стандартном каталоге
включаемых файлов. Часто это - каталог /usr/include/CC. Файлы, находящиеся
в других каталогах, обозначаются своими путевыми именами, взятыми в
кавычки. Поэтому в следующих командах:

          #include "math1.h"
          #include "/usr/bs/math2.h"

    включаются файл math1.h из текущего каталога пользователя и файл
math2.h из каталога /usr/bs.

    Приведем небольшой законченный пример, в котором строка определяется в
одном файле, а печатается в другом. В файле header.h определяются нужные
типы:

          // header.h

          extern char * prog_name;
          extern void f ();

    Файл main.c является основной программой:

          // main.c

          #include "header.h"
          char * prog_name = "примитивный, но законченный пример";
          int main ()
          {
            f ();
          }

    а строка печатается функцией из файла f.c:

          // f.c

          #include <stream.h>
          #include "header.h"
          void f ()
          {
            cout << prog_name << '\n';
          }

    При запуске транслятора С++ и передаче ему необходимых
файлов-параметров в различных реализациях могут использоваться разные
расширения имен для программ на С++. На машине автора трансляция и запуск
программы выглядит так:

          $ CC main.c f.c -o silly
          $ silly

            примитивный, но законченный пример

          $

    Кроме раздельной трансляции концепцию модульности в С++ поддерживают
классы ($$5.4).

 
« Предыдущая статья   Следующая статья »