search

Многофайловые программы

Как только программы становятся больше – их следует разделять на несколько файлов, в организационных и функциональных целях. Одним из преимуществ работы в IDE является легкость при работе с n-ым количеством файлов. Вы уже знаете, как создавать и компилировать однофайловые проекты, а добавление новых также не составит труда.

Добавление файлов в проект. Visual Studio

В Visual Studio щелкните правой кнопкой мыши на Source Files в Solution Explorer и выберите Add > New Item. Убедитесь, что у вас выбран C++ File (.cpp). Дайте новому файлу имя и он добавится в ваш проект.

Примечание: Если вы создаете новый файл из меню File, а не в Solution Explorer, то он не добавится к вашему проекту автоматически. Нужно будет подключать вручную. Для этого нужно щелкнуть правой кнопкой мыши на Source Files в Solution Explorer, выбрать Add > Existing Item, а затем выбрать нужный файл.

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

Добавление файлов в проект. Code::Blocks

В Code::Blocks перейдите в меню File и выберите New file. Дайте новому файлу имя (не забудьте расширение .cpp), затем Code::Blocks спросит вас, желаете ли вы добавить его к активному проекту. Нажмите Yes. Вам также нужно будет поставить галочки возле Release и Debug, дабы убедиться, что файл добавится к обеим версиям.

Если Code::Blocks не спросит вас о добавлении файла в активный проект или если файл не отобразится в панели проекта – нужно будет добавлять вручную. Для этого щелкните правой кнопкой мыши по имени проекта в панели проекта, выберите Add File, найдите только что созданный файл и добавьте его.

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

Если новый файл не компилируется или не проходит линкинг в Code::Blocks, убедитесь, что он подключен для компиляции и линкинга. Для этого щелкните правой кнопкой мыши по файлу в панели проекта и выберите Properties. На вкладке General вы увидите чекбоксы, возле которых должны быть галочки (они указывают на то, будет ли файл подключен к компиляции и линкингу). Убедитесь, что галочки поставлены.

Добавление файлов в проект. Командная строка

В командной строке вы можете создать дополнительный файл и дать ему имя самостоятельно, используя редактор. При компиляции программы, вам необходимо будет подключить все соответствующие файлы с кодом. Например: g++ main.cpp add.cpp -o main (где main.cpp и add.cpp – это имена файлов с кодом, а main — это имя выходного файла).

Пример многофайловой программы

Рассмотрим следующую программу, которая состоит из нескольких файлов. add.cpp:

	
//#include "stdafx.h" // раскомментируйте, если используете Visual Studio
 
int add(int x, int y)
{
    return x + y;
}
main.cpp:

//#include "stdafx.h" // раскомментируйте, если используете Visual Studio
#include <iostream>
 
int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}
//#include "stdafx.h" // раскомментируйте, если используете Visual Studio
#include <iostream>
 
int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}

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


add.cpp(10) : error C3861: 'add': identifier not found
add.cpp(15) : error C2365: 'add' : redefinition; previous definition was 'formerly unknown identifier'

Когда компилятор компилирует код, он не знает о существовании функций, которые находятся в других файлах. Это сделано специально, дабы функции или переменные с одинаковыми именами, которые находятся в разных файлах, не вызывали конфликт имен.

Тем не менее, в данном случае, мы хотим, чтобы main.cpp знал (и использовал) функцию аdd(), которая находится в add.cpp. Для предоставления доступа main.cpp к функции add, мы можем использовать предварительное объявление.
main.cpp с предварительным объявлением:


//#include "stdafx.h" // раскомментируйте, если используете Visual Studio
#include <iostream>
 
int add(int x, int y); // это нужно для того, чтобы main.cpp знал, что функция add() определена в другом месте

int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}
//#include "stdafx.h" // раскомментируйте, если используете Visual Studio
#include <iostream>
 
int add(int x, int y); // это нужно для того, чтобы main.cpp знал, что функция add() определена в другом месте
 
int main()
{
    using namespace std;
    cout << "The sum of 3 and 4 is: " << add(3, 4) << endl;
    return 0;
}

Теперь, когда компилятор скомпилирует main.cpp, он будет знать, что такое add(). Используя этот метод, мы можем предоставлять доступ одним файлам к функциям, которые находятся в других файлах.
Попробуйте скомпилировать add.cpp и main.cpp с предварительным объявлением сами. Если получите ошибку линкера, убедитесь, что вы добавили add.cpp к вашему проекту.

Что-то пошло не так!


Есть много вещей, которые могут пойти не так, в первый раз, когда вы попытаетесь работать с несколькими файлами. Возникли проблемы? Проверьте следующее:

1. Если вы получили ошибку компилятора, что add() не определен в main(), вы, вероятно, забыли записать предварительное объявление в main.cpp.

2. Если вы получили ошибку линкера о том, что add не определен, например:

unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z) referenced in function _main

то возможных решений есть несколько:

 наиболее вероятной причиной является то, что add.cpp не корректно добавлен в ваш проект. Если вы используете Visual Studio или Code::Blocks, вы должны увидеть add.cpp в Solution Explorer или в панели проекта IDE. Если нет, то щелкните правой кнопкой мыши по вашему проекту и добавьте файл, а затем повторите попытку компиляции. Если вы проводите компиляцию с помощью командной строки — не забудьте подключить как main.cpp, так и add.cpp.

 вполне возможно, что вы добавили add.cpp к другому проекту.

 вполне возможно, что файл не подключен к компиляции или линкингу. Проверьте свойства файла и убедитесь, что поставлены галочки возле пунктов о компиляции/линкинге файла. В Visual Studio есть еще опция «exclude from build» (исключить из сборки), которая должна быть установлена на «нет» или оставлена пустой.

3. Если вы используете Visual Studio с предварительно откомпилированными заголовками, каждый файл кода должен иметь строчку: #include "stdafx.h". Как main.cpp, так и add.cpp.

4. Не пишите строчку: #include "add.cpp" в main.cpp. Это приведет к тому, что компилятор вставит содержимое add.cpp непосредственно в main.cpp вместо того, чтобы рассматривать их как отдельные файлы. Даже если это скомпилируется сейчас, позднее вы будете постоянно сталкиваться с проблемами, используя этот способ.

Напоследок
Мы начнем больше работать с многофайловыми проектами при изучении объектно-ориентированного программирования, так что сейчас как раз подходящее время, дабы освоить азы.

Напоминание: Всякий раз, когда вы создаете новый файл кода (.cpp) — добавляйте его в свой проект.
Источник: ravesli