Партнерка на США и Канаду по недвижимости, выплаты в крипто

  • 30% recurring commission
  • Выплаты в USDT
  • Вывод каждую неделю
  • Комиссия до 5 лет за каждого referral

4.1.  Многофайловая программа

4.1.1.  Схема построения многофайловой программы

Однофайловая программа

На рис.1 представлена схема формирования исполняемого (exe) файла для программы, исходный код которой размещен в одном файле. Если исходный код невелик, то вполне можно обойтись представленным на схеме вариантом программы. Если же исходный код начинает разрастаться, то накладные расходы на его компиляцию становятся неоправданно высоки и возникает необходимость перехода к многофайловой организации программы.

Рис.1. Схема формирования исполняемого файла однофайловой программы.

Многофайловая программа. Директива препроцессора #include

Схема формирования многофайловой программы представлена на рис.2.

В этой программе в файле main. cpp оставлена функция main; функция sum вынесена в отдельный исходный файл module. cpp. Если сделано только то, что описано в предыдущем пункте, то программа компилироваться не будет, т. к. перед функцией main в файле main. cpp нет объявления прототипа функции sum.

Для «исправления» этой ситуации в многофайловых программах языка С добавляют еще один файл module. h, в который вносят объявления всех функций файла module. cpp, а в файл main. cpp добавляют директиву препроцессора #include “module. h”. Перед компиляцией файл main. cpp будет обрабатываться препроцессором, который вместо директивы #include “module. h” вставит в файл main. cpp содержимое файла module. h и компиляция пройдет успешно.

Файлы c расширением cpp принято называть исходными файлами модуля, а соответствующие файлы с расширением h – заголовочными файлами модуля.

НЕ нашли? Не то? Что вы ищете?

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

Заголовочные файлы модулей принято подключать с помощью директивы include не только к исходным файлам, использующим модули, но и к исполняемым файлам модулей.

Рис.2. Схема формирования исполняемого файла многофайловой программы.

4.1.2.  Директивы препроцессора #ifndef, #define, #endif

На рис. 3 схема организации трехфайловой программы, включающей исходный файл main. cpp и два модуля: person и phone. Для упрощения на схеме представлены только заголовочные файлы модулей с объявлением структур Person и PhoneBook. В полной мере заголовочные файлы должны включать объявления прототипов функций работы с этими структурами.

Рис.3. Схема организации трехфайловой программы.

После обработки препроцессором файла main. cpp, этот файл примет вид, представленный на рис. 3.а. При компиляции этого файла будет зафиксирована ошибка двойного объявления структуры Person.

Рис.3.1. Результат обработки препроцессором файла main. cpp рис.3.

Для того избежать повторного срабатывания директивы include при вложенных связях между модулями программы, описание заголовочных файлов модулей должно включать использование директив препроцессора #ifndef, #define, #endif так, как это показано на рис. 4.

Рис. 4. Использование директив препроцессора #ifndef, #define, #endif в файле person. h.

Комментарии к рис.4 начнем с понятия макроса. Макрос это специальный объект препроцессора, который объявляется с помощью директивы #difine, которая в общем случае имеет вид:

#define <имя_макроса>[<параметры_макроса> <тело_макроса>]

В объявлении макроса обязательным является только имя макроса. Имя макроса это идентификатор, в записи которого принято использовать только строчные буквы, подчерк и цифры.

Параметры макроса и тело могут быть опущены; в нашем случае они не потребуются, и говорить о них пока не будем.

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

Директива #ifndef (директива условной компиляции) имеет вид:

#ifndefi <имя_макроса>

и обрабатывается препроцессором так:

·  если макрос <имя_макроса> не был объявлен, то весь код, следующий за директивой до директивы #endif переносится в код программы;

·  иначе выполняется переход на директиву #endif.

Итак, в случае заголовочный файл, представленных на рис. 4 будет обрабатываться так:

·  если макрос PERSON_H_ еще не был объявлен, то он будет объявлен и объявление структуры Person будет добавлено в формируемый препроцессором код;

·  иначе этого сделано не будет.

Полная схема организации трехфайловой программы с использованием директив #ifndef, #define, #endif представлена на рис. 4.

Рис.4. Схема организации трехфайловой программы с использованием директив #ifndef, #define, #endif.

4.1.3.  Общие правила формирования заголовочных файлов

Общая схема заголовочного файла

Общая схема заголовочного файла имеет вид:

#ifndef <имя_модуля>

#define <имя_модуля>

#include "<необходимый_модуль1>" // Если необходимо

#include "<необходимый_модуль2>" // Если необходимо

...

#include "<необходимый_модульn>" // Если необходимо

// Интерфейсная часть модуля

...

#endif

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

Куда подключаются заголовочные файлы?

1.  Заголовочный файл (module. h) целесообразно подключать к «своему» исполняемому файлу (module. cpp).

2.  Если module1 использует объекты module2, то:

·  если (и только если) объекты module2 используются в заголовочном файле module1, то заголовочный файл module1.h подключается к заголовочному файлу module2.h и не подключается (при соблюдении правила 1) к исполняемому файлу module2.cpp.

·  иначе заголовочный файл module1.h подключается к исполняемому файлу module2.cpp и не подключается к заголовочному файлу module2.h.

4.2.  Создание статической библиотеки

4.2.1.  Статическая библиотека

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

Для создания статической библиотеки надо выполнить следующие действия:

1.  Создание проекта статической библиотеки.

2.  Добавление функций и компиляция статической библиотеки.

3.  Компиляция библиотеки.

4.  Подключение библиотеки к проекту.

4.2.2.  Создание проекта статической библиотеки

В главном меню VisualStudio выберите команду: File – New – Project.

В появившемся окне «New Project» (рис.5):

1.  Выберите Visual C++ - Win32.

2.  Выберите Win32 Console Application.

3.  Введите имя библиотеки.

4.  ОК.

Рис. 5. Окно «New Project»

В появившемся окне «Win32 Application Wizard» (рис. 6) выберите Next, затем:

1.  Установите «Static library»; снимите «Precompiled header».

2.  Выберите «Finish».

Рис. 6. Окно «Win32 Application Wizard».

4.2.3.  Добавление функций и компиляция статической библиотеки

На панели «Solution Explorer» (рис. 7) выполните действия:

·  Header Files – Add – New Item… - Header File (.h)

·  Source Files – Add – New Item… - C++ File (.cpp)

Рис. 7. Панель «Solution Explorer».

В появившиеся заголовочный и исходный файлы скопируйте тексты заголовочного и исходного кода.

Выполните команду главного меню: Build – Build Solution.

В результате папке Debug проекта появится файл с расширением lib – файл скомпилированной статической библиотеки.

Создайте папку, в которой будут храниться Ваши библиотеки, например, D:/MyLibraries. Перепишите в эту папку созданную библиотеку (файл lib) и ее заголовочный файл (файл h).

4.2.4.  Подключение библиотеки к проекту

Для подключения созданной библиотеки к проекту приложения надо открыть проект и выполнить в нем следующие действия.

Настройка ссылки (пути) к заголовочному файлу библиотеки

В главном меню VisualStudio выберите команду: Project - Properties.

В появившемся окне «Property Pages» (рис.8):

1.  Выберите Configuration Properties.

2.  Выберите C/C++.

3.  Выберите General.

4.  В позиции Additional Include Directories раскройте список.

5.  Выберите Edit

Рис. 8. Окно «Property Pages».

В появившемся окне «Additional Include Directories» (рис. 9):

1.  Выберите папку.

2.  Выберите кнопку выбора папки.

3.  В появившемся окне выбора папки выберите папку с библиотекой (D:/MyLibraries).

4.  ОК.

Рис. 9. Окно «Additional Include Directories».

Настройка дополнительных зависимостей (имени библиотеки)

В главном меню VisualStudio выберите команду: Project - Properties.

В появившемся окне «Property Pages» (рис.10):

1.  Выберите Configuration Properties.

2.  Выберите Linker.

3.  Выберите Input.

4.  Выберите поле значения Additional Dependencies.

5.  Выберите Edit

В появившемся окне «Additional Dependencies» (рис.10):

6.  Введите имя библиотеки.

7.  ОК

8.  ОК

Рис. 10. Окно «Property Pages».

Настройка (ссылки) пути к файлу библиотеки

В главном меню VisualStudio выберите команду: Project - Properties.

В появившемся окне «Property Pages» (рис.11):

1.  Выберите Configuration Properties.

2.  Выберите Linker.

3.  Выберите General.

4.  Раскройте список Additional Library Directories.

5.  Выберите Edit

Рис. 11. Окно «Property Pages».

В появившемся окне «Additional Library Directories» (рис. 12):

1.  Выберите папку.

2.  Выберите кнопку выбора папки.

3.  В появившемся окне выбора папки выберите папку с библиотекой (D:/MyLibraries).

4.  ОК.

Рис. 12. Окно «Additional Library Directories».

Литература

1.  Б. Керниган, Д. Ритчи. Язык программирования Си. Препроцессор языка Си. URL: http://. ru/kr_cbook/ch4kr. html#p411

2.  Герберт Шилдт. Полный справочник по С. Препроцессор и комментарии. URL: http://. ru/shildt_spr_po_c/10/10.html

3.  Пошаговое руководство. Создание и использование статической библиотеки (C++). URL: https://msdn. microsoft. com/ru-ru/library/ms235627.aspx