Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С++ Страуструп.doc
Скачиваний:
4
Добавлен:
18.04.2019
Размер:
2.72 Mб
Скачать

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).

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]