В данном уроке мы рассмотрим многофайловые программы. Программа используемая здесь основана на pseudo_game из урока по структурам. Отличия минимальны. Поэтому, прежде чем приступить к материалу - прочитайте этот урок и выполните упражнения к нему.

До этого момента, все наши программы состояли из одного файла. Но с каждым уроком программы становятся всё больше и сложнее. Последняя версия pseudo_game состоит примерно из 150 строк кода. Это немного, но уже можно задумываться над разбиением программы на несколько файлов. Обычно программу разбивают на файлы, каждый из которых выполняет какую-то определённую задачу. Пока нам это не нужно. Мы просто вынесем функции в отдельный файл. В учебных так сказать целях.
Сборка программы

Процесс создания программы из исходных файлов называется сборкой (building). Сборка включает в себя две стадии: компиляцию (compiling) и связывание (linking, другой перевод - компоновка).

Во время компиляции происходит создание объектных файлов (обычно с расширением .obj) из исходных (с расширением .cpp или .cc) и заговочных (с расширением .h). После того как скомпилировались объектные файлы в дело вступает компоновщик и связывает объектные и библиотечные файлы (c расширением .lib). В конце сборки, если ни компилятор, ни компоновщик не выдали ошибок, мы получем исполняемый файл (с расширением .exe).
Дополнительные файлы

Создайте новый проект (или даже решение). Создайте в нём файл pg. Добавьте ещё один исходный файл, например, sub_lib. В первый файл скопируйте всё содержимое pseudo_game из урока по структурам. Сейчас Вы можете запустить программу, она прекрасно работает. Два эти файла находятся в одном проекте и связываются компоновщиком в объектный файл. Эти два файла могут использовать общие переменные с помощью ключевого слова extern. Они могут использовать общие функции. Для этого в одном из них функция должна быть объявлена, а в другом определена. Чтобы использовать общие структуры в файлах, потребуется написать определения структур в каждом файле.

Заметьте, что файлы никак не связаны друг с другом: не нужно указывать о существовании файла sub_lib.cc в pg.cc, за нас это делает компоновщик.
Заголовочные файлы

Для облегчения взаимодействия между файлами используют заголовочные файлы (с расширением .h). Мы уже сталкивались с ними: с помощью директивы #inlude мы добавляли заголовчные файлы в наши программы. Напомню, что директива #include копирует содержимое заголовочного файла (вообще-то любого файла, который вы укажете), в файл где она вызывается. Угловые скобки говорят компилятору, что заголовочный файл нужно искать в специальных папках.

Давайте добавим заголовочный файл в нашу программу. Назовите его sub_lib.h. Имя этого файла может быть любым и оно необязано совпадать с именем второго исходного файла. для добавления заголовчного файла выберите File -> New -> File, а в открывшемся окне выберите Header file (.h). Присоедините его к проекту.

В заголовочный файл вынесите все директивы #include, определение структуры tank, определение перечисления cardinal_dirs, определения констант и объявления всех функций. Всё это удалите из первого файла и добавьте только одну строчку:

#inlcude "sub_lib.h";

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

В файл sub_lib.cc добавьте эту же директиву и скопируйте все функции кроме main() из файла pg.cc.

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