Як тільки програми стають більшими, їх слід розбивати на декілька файлів (для зручності та покращення функціональності). Однією з переваг використання IDE є легкість в роботі з n-ою кількістю файлів. Ми вже знаємо, як створювати і компілювати однофайлові проекти, додання нових файлів не складе труднощів.
Багатофайлові проекти в Visual Studio
У Visual Studio клацніть правою кнопкою миші по імені вашого проекту в "Обозревателе решений", після чого виберіть "Добавить" > "Создать элемент...":

У спливаючому діалоговому вікні виберіть тип "Файл С++", вкажіть ім’я та місцезнаходження файлу і після цього натисніть "Добавить":

Також ви можете додавати файли до вашого проекту через "Проект" > "Добавить новый элемент...":
Багатофайлові проекти в Code::Blocks
В Code::Blocks перейдіть в меню "File" > "New" > "File...":

Після цього виберіть "C/C++ source" і натисніть "Go":

Потім "Next" (це вікно може бути, а може і не бути):

Потім "C++" і знову "Next":

Тепер вкажіть ім’я новому файлу (пам’ятайте про розширення .cpp) і його місцезнаходження (натисніть на три крапки і виберіть шлях). Переконайтесь, що поставлені всі три галочки (вони відповідають за режими конфігурації). Після цього натисніть на "Finish":

Багатофайлові проекти в GCC/G++
У командному рядку вам необхідно буде створити файл, вказати його ім’я і підключити до компіляції. Наприклад:
g++ main.cpp add.cpp -o main
(де main.cpp і add.cpp — це імена файлів з кодом, а main — це ім’я файлу-результата)
Приклад багатофайлової програми
Розглянемо наступну програму, яка складається з двох файлів.
add.cpp:
|
1 2 3 4 |
int add(int x, int y) { return x + y; } |
main.cpp:
|
1 2 3 4 5 6 7 |
#include <iostream> int main() { std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl; return 0; } |
Спробуйте запустити цю програму. Вона не скомпілюється і ви отримаєте наступну помилку:
add: идентификатор не найден
При компіляції коду, компілятор не знає про існування функцій, які знаходяться в інших файлах. Це зроблено спеціально, щоб функції і змінні з однаковими іменами, але в різних файлах, не спричиняли конфлікт імен.
Проте, в даному випадку, ми хочемо, щоб main.cpp знав (і використовував) функцію аdd(), яка знаходиться в add.cpp. Для надання доступу main.cpp до функцій в add.cpp, нам потрібно використати попереднє оголошення:
|
1 2 3 4 5 6 7 8 9 |
#include <iostream> int add(int x, int y); // це потрібно для того, щоб main.cpp знав, що функція add() визначена в іншому місці int main() { std::cout << "The sum of 3 and 4 is: " << add(3, 4) << std::endl; return 0; } |
Тепер, коли компілятор компілюватиме main.cpp, він знатиме, що таке add(). Спробуйте запустити цю програму ще раз.
Щось пішло не так!
Є багато речей, які можуть піти не так, особливо, якщо ви це робите в перший раз. Головне — не панікувати:
Пункт №1: Якщо ви отримали помилку від компілятора, що функція add() не визначена в функції main(), то, швидше за все, ви забули записати попереднє оголошення функції add() в main.cpp.
Пункт №2: Якщо ви отримали наступну помилку від лінкера:
unresolved external symbol "int __cdecl add(int,int)" (?add@@YAHHH@Z) referenced in function _main
То можливих рішень є декілька:
a) Швидше за все, add.cpp некоректно доданий в ваш проект. Якщо ви використовуєте Visual Studio або Code::Blocks, то ви повинні побачити add.cpp в "Обозревателе решений" в списку файлів вашого проекту або в панелі проекту IDE. Якщо доданого файлу немає, то клацніть правою кнопкою миші по імені вашого проекту і додайте файл, як це показано вище, а потім спробуйте ще раз скомпілювати ваш проект.
б) Цілком можливо, що ви додали add.cpp до іншого проекту.
в) Цілком можливо, що доданий файл не підключений до компіляції/лінкінгу. Клацніть правою кнопкою миші по імені вашого доданого файлу і виберіть пункт "Свойства":

Переконайтеся, що пункт "Исключен из сборки" залишений порожнім або вибрано значення "Нет":

Пункт №3: Не пишіть наступний рядок в main.cpp:
|
1 |
#include "add.cpp" |
Це призведе до того, що компілятор вставить весь вміст add.cpp безпосередньо в main.cpp замість того, щоб розглядати ці файли як окремі.
Тест
Розділіть наступну програму на два файли (main.cpp і input.cpp): main.cpp повинен містити функцію main(), а input.cpp повинен містити функцію getInteger().
Не забувайте, що для функції getInteger() вам знадобиться попереднє оголошення в main.cpp.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> int getInteger() { std::cout << "Enter an integer: "; int x; std::cin >> x; return x; } int main() { int x = getInteger(); int y = getInteger(); std::cout << x << " + " << y << " is " << x + y << '\n'; return 0; } |
Відповідь
input.cpp:
|
1 2 3 4 5 6 7 8 9 |
#include <iostream> int getInteger() { std::cout << "Enter an integer: "; int x; std::cin >> x; return x; } |
main.cpp:
|
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <iostream> int getInteger(); // попереднє оголошення функції getInteger() int main() { int x = getInteger(); int y = getInteger(); std::cout << x << " + " << y << " is " << x + y << '\n'; return 0; } |


Варто було б додати до “Пункт №3” чому не можна писати наступний рядок в main.cpp:
Ось пояснення чому:
Вставка ‘#include “add.cpp” ‘ у файл ‘main.cpp’ призведе до того, що весь вміст файлу ‘add.cpp’ буде буквально вставлений у місце цього виклику. Це може викликати кілька проблем:
1. Подвійна компіляція: Якщо ви включаєте ‘add.cpp’ у кілька файлів, наприклад, у ‘main.cpp’ і ще в інші файли проєкту, компілятор буде обробляти цей файл кілька разів. Це може призвести до помилок повторного визначення функцій та змінних.
2. Порушення модульності: Практика включення ‘.cpp’ файлів порушує логіку модульного коду. Зазвичай, код поділяється на заголовкові файли (‘.h’) для оголошень і реалізаційні файли (‘.cpp’) для реалізації. Цей підхід дозволяє підтримувати чітке розділення між інтерфейсом і реалізацією.
3. Проблеми з лінкером: Якщо компілятор обробляє кілька копій одного й того ж коду, це може викликати помилки під час процесу лінкування через повторне оголошення або визначення.
4. Уповільнення компіляції: Кожного разу при включенні ‘.cpp’ файлу компілятор повинен обробляти весь код у файлі, що може суттєво уповільнити процес компіляції великих проєктів. Правильний підхід — це оголошувати функції в заголовковому файлі (наприклад, ‘add.h’), а їхню реалізацію писати в окремому ‘.cpp’ файлі (наприклад, ‘add.cpp’), і включати лише заголовковий файл у ‘main.cpp’:
Таким чином, компілятор і лінкер зможуть коректно обробляти кожен файл окремо.
Не можу знайти .cpp аби додати його в проект. Натискаючи Ctrl+Shift+A у запропонованих варіантах (теки “instaled” i “Online”) не можу знайти “File C++ (.cpp)” Підкажіть що я міг би зробити для усунення цієї проблеми? Необхідно перевстановити VS?
натисни на вид на панелі зверху > обозреватель решений > а потім те що написано
Я зробив усе як було описано в прикладі, але отримав помилку. В розділі "Щось пішло не так" є рішення – зайти у "Свойства" і там в чомусь переконатися, але у мене в VS після натиснення на "Свойства" нічого не відбувається. Увесь день шукав пояснення в інтернеті і в підсумку вирішив додати на початку main.cpp #include "add.cpp" (Те, що ви писали не робити) і все запрацювало. Те ж саме і з заголовковими файлами . Доки я не додам у заголовковий файл #include "add.cpp", буде видавати помилку LNK2019 і LNK1120
У мене все добре. Після вашого коментаря перевірив, але все вийшло і без #include “add.cpp”