Чтение онлайн

на главную - закладки

Жанры

Шрифт:

Иногда возникает сложность, состоящая в том, что подоная гибкость достигается без формальной структуры. Сам язык не распознает такой модуль как объект, и у компилятора нет возможности отличить .h файлы, определяющие имена, которые должны использовать другие модули (экспортируемые), от .h файлов, которые описывают имена из других модулей (импортиремые).

В других случаях может возникнуть та проблема, что мдуль определяет множество объектов, а не новый тип. Например, модуль table определяет одну таблицу, и если вам нужно две таблицы, то нет простого способа

задать вторую таблицу с пмощью понятия модуля. Решение этой проблемы приводится в Глве 5.

Каждый статически размещенный объект по умолчанию иницализируется нулем, программист может задать другие (константные) значения. Это только самый примитивный вид инциализации. К счастью, с помощью классов можно задать код, который выполняется для инициализации перед тем, как модуль какимлибо образом используется, и/или код, который запускаеся для очистки после последнего использования модуля, см. #5.5.2.

4.5 Как создать библиотеку

Фразы типа «помещен в библиотеку» и «ищется в какой-то библиотеке» используются часто (и в этой книге, и в других), но что это означает для С++ программы? К сожалению, ответ звисит от того, какая операционная система используется; в этом разделе объясняется, как создать библиотеку в 8-ой весии системы UNIX. Другие системы предоставляют аналогичные возможности.

Библиотека в своей основе является множеством .o файлов, полученных в результате компиляции соответствующего множества .c файлов. Обычно имеется один или более .h файлов, в которых содержатся описания для использования этих .o файлов. В кчестве примера рассмотрим случай, когда нам надо задать (обычным способом) набор математических функций для некоторго неопределенного множества пользователей. Заголовочный файл мог бы выглядеть примерно так:

extern double sqrt(double); // подмножество «math.h» extern double sin(double); extern double cos(double); extern double exp(double); extern double log(double);

а определения этих функций хранились бы, соответственно, в файлах sqrt.c, sin.c, cos.c, exp.c и log.c.

Библиотеку с именем math.h можно создать, например, так:

$ CC -c sqrt.c sin.c cos.c exp.c log.c $ ar cr math.a sqrt.o sin.o cos.o exp.o log.o $ ranlib math.a

Вначале исходные файлы компилируются в эквивалентные им объектные файлы. Затем используется команда ar, чтобы создать архив с именем math.a. И, наконец, этот архив индексируется для ускорения доступа. Если в вашей системе нет ranlib комады, значит она вам, вероятно, не понадобится. Подробности посмотрите, пожалуйста, в вашем руководстве в разделе под зголовком ar. Использовать библиотеку можно, например, так:

$ CC myprog.c math.a

Теперь разберемся, в чем же преимущества использования math.a перед просто непосредственным использованием .o фалов? Например:

$ CC myprog.c sqrt.o sin.o cos.o exp.o log.o

Для большинства программ определить правильный набор .o файлов, несомненно, непросто. В приведенном выше примере они включались все, но если функции в myprog.c вызывают только функции sqrt и cos,

то кажется, что будет достаточно

$ CC myprog.c sqrt.o cos.o

Но это не так, поскольку cos.c использует sin.c.

Компоновщик, вызываемый командой CC для обработки .a файла (в данном случае, файла math.a) знает, как из того мнжества, которое использовалось для создания .a файла, извлечь только необходимые .o файлы.

Другими словами, используя библиотеку можно включать много определений с помощью одного имени (включения определний функций и переменных, используемых внутренними функциями,

никогда не видны пользователю), и, кроме того, обеспечить, что в результате в программу будет включено минимальное колчество определений.

4.6 Функции

Обычный способ сделать что-либо в С++ программе – это вызвать функцию, которая это делает. Определение функции яляется способом задать то, как должно делаться некоторое действие. Функция не может быть вызвана, пока она не описана.

4.6.1 Описания функций

Описание функции задает имя функции, тип возвращаемого функцией значения (если таковое есть) и число и типы парамеров, которые должны быть в вызове функции. Например:

extern double sqrt(double); extern elem* next_elem; extern char* strcpy(char* to, const char* from); extern void exit(int);

Семантика передачи параметров идентична семантике иницализации. Проверяются типы параметров, и когда нужно произвдится неявное преобразование типа. Например, если были заданы предыдущие определения, то

double sr2 = sqrt(2);

будет правильно обращаться к функции sqrt со значением с плавающей точкой 2.0. Значение такой проверки типа и преоразования типа огромно.

Описание функции может содержать имена параметров. Это может помочь читателю, но компилятор эти имена просто игноррует.

4.6.2 Определения функций

Каждая функция, вызываемая в программе, должна быть гдто определена (только один раз). Определение функции – это описание функции, в котором приводится тело функции. Напрмер:

extern void swap(int*, int*); // описание

void swap(int*, int*) // определение (* int t = *p; *p =*q; *q = t; *)

Чтобы избежать расходов на вызов функции, функцию можно описать как inline (#1.12), а чтобы обеспечить более быстрый доступ к параметрам, их можно описать как register (#2.3.11). Оба средства могут использоваться неправильно, и их следует избегать везде где есть какие-либо сомнения в их полезности.

4.6.3 Передача параметров

Когда вызывается функция, дополнительно выделяется пмять под ее формальные параметры, и каждый формальный парметр инициализируется соответствующим ему фактическим парметром. Семантика передачи параметров идентична семантике инициализации. В частности, тип фактического параметра сопотавляется с типом формального параметра, и выполняются все

Поделиться:
Популярные книги

Война с саламандрами (сборник)

Чапек Карел
Фантастика:
социально-философская фантастика
5.00
рейтинг книги
Война с саламандрами (сборник)

Герой

Бубела Олег Николаевич
4. Совсем не герой
Фантастика:
фэнтези
попаданцы
9.26
рейтинг книги
Герой

Газлайтер. Том 19

Володин Григорий Григорьевич
19. История Телепата
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Газлайтер. Том 19

Эволюционер из трущоб. Том 13

Панарин Антон
13. Эволюционер из трущоб
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Эволюционер из трущоб. Том 13

Наука побеждать (сборник)

Суворов Александр Васильевич
Великие полководцы
Документальная литература:
биографии и мемуары
7.00
рейтинг книги
Наука побеждать (сборник)

Основные произведения иностранной художественной литературы. Азия. Африка

Коллектив авторов
Научно-образовательная:
языкознание
литературоведение
5.00
рейтинг книги
Основные произведения иностранной художественной литературы. Азия. Африка

Попаданец на рыбалке. Книги 1-7

Скворцов Владимир Николаевич
Попаданец на рыбалке
Фантастика:
фэнтези
попаданцы
6.88
рейтинг книги
Попаданец на рыбалке. Книги 1-7

Скажи изюм

Аксенов Василий Павлович
Проза:
современная проза
5.00
рейтинг книги
Скажи изюм

Башня шутов

Сапковский Анджей
1. Сага о Рейневане
Фантастика:
фэнтези
8.53
рейтинг книги
Башня шутов

Второгодка. Книга 4. Подавать холодным

Ромов Дмитрий
4. Второгодка
Фантастика:
героическая фантастика
альтернативная история
сказочная фантастика
5.00
рейтинг книги
Второгодка. Книга 4. Подавать холодным

Древняя Русь и Великая степь

Гумилев Лев Николаевич
Научно-образовательная:
история
7.25
рейтинг книги
Древняя Русь и Великая степь

Воля и власть

Балашов Дмитрий Михайлович
8. Государи московские
Научно-образовательная:
история
6.29
рейтинг книги
Воля и власть

Русская мафия 1988-2007

Карышев Валерий Михайлович
Документальная литература:
публицистика
6.25
рейтинг книги
Русская мафия 1988-2007

Тёмный Лорд Поттер

The Santi
Проект «Поттер-Фанфикшн»
Фантастика:
фэнтези
городское фэнтези
5.00
рейтинг книги
Тёмный Лорд Поттер