Урок №23. Багатофайлові програми

 13493

 ǀ   5 

Як тільки програми стають більшими, їх слід розбивати на декілька файлів (для зручності та покращення функціональності). Однією з переваг використання 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:

main.cpp:

Спробуйте запустити цю програму. Вона не скомпілюється і ви отримаєте наступну помилку:

add: идентификатор не найден

При компіляції коду, компілятор не знає про існування функцій, які знаходяться в інших файлах. Це зроблено спеціально, щоб функції і змінні з однаковими іменами, але в різних файлах, не спричиняли конфлікт імен.

Проте, в даному випадку, ми хочемо, щоб main.cpp знав (і використовував) функцію аdd(), яка знаходиться в add.cpp. Для надання доступу main.cpp до функцій в add.cpp, нам потрібно використати попереднє оголошення:

Тепер, коли компілятор компілюватиме 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:

Це призведе до того, що компілятор вставить весь вміст add.cpp безпосередньо в main.cpp замість того, щоб розглядати ці файли як окремі.

Тест

Розділіть наступну програму на два файли (main.cpp і input.cpp): main.cpp повинен містити функцію main(), а input.cpp повинен містити функцію getInteger().

Не забувайте, що для функції getInteger() вам знадобиться попереднє оголошення в main.cpp.

Відповідь

input.cpp:

main.cpp:

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (122 оцінок, середня: 4,98 з 5)
Завантаження...

Коментарів: 5

  1. Volodymyr Tyshchenko :

    Варто було б додати до “Пункт №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’:

    Таким чином, компілятор і лінкер зможуть коректно обробляти кожен файл окремо.

  2. Dima :

    Не можу знайти .cpp аби додати його в проект. Натискаючи Ctrl+Shift+A у запропонованих варіантах (теки “instaled” i “Online”) не можу знайти “File C++ (.cpp)” Підкажіть що я міг би зробити для усунення цієї проблеми? Необхідно перевстановити VS?

    1. lev :

      натисни на вид на панелі зверху > обозреватель решений > а потім те що написано

  3. Максим :

    Я зробив усе як було описано в прикладі, але отримав помилку. В розділі "Щось пішло не так" є рішення – зайти у "Свойства" і там в чомусь переконатися, але у мене в VS після натиснення на "Свойства" нічого не відбувається. Увесь день шукав пояснення в інтернеті і в підсумку вирішив додати на початку main.cpp #include "add.cpp" (Те, що ви писали не робити) і все запрацювало. Те ж саме і з заголовковими файлами . Доки я не додам у заголовковий файл #include "add.cpp", буде видавати помилку LNK2019 і LNK1120

    1. Данило :

      У мене все добре. Після вашого коментаря перевірив, але все вийшло і без  #include “add.cpp”

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *