Ви написали функції, які працюють. Генератор rand та алгоритм bubble_sort надійні. Тепер вам потрібно використовувати їх у інших місцях. Копіювання та вставка коду – це безлад. Це створює помилки. Це перетворює підтримку на кошмар.
Рішення – бібліотека утиліт.
C бібліотека — це не магічний ящик. Це два конкретні файли, що працюють разом: заголовний файл (.h ) та вихідний файл (.c ). Заголовний файл повідомляє компілятор, що доступно. Вихідний файл містить саму логіку.
Ось як структурувати базову бібліотеку C, щоб підтримувати чистоту і модульність вашого коду.
Визначення інтерфейсу
Кожна публічна функція повинна мати оголошення. Воно знаходиться в заголовному файлі.
Створіть файл із ім’ям util.h.
`
Ці рядки є прототипами функцій. Ключове слово extern важливе. Воно повідомляє компілятор: «Ця функція існує, але я поки не знаю, де саме. Я знайду її пізніше на етапі лінківки».
Якщо ви використовуєте дуже старий компілятор C, можливо вам доведеться видалити імена параметрів з bubble_sort. Сучасні стандарти віддають перевагу повним прототипам, але застарілий код часто їх прибирає.
Реалізація логіки
Тепер про найскладнішу частину. Створіть util.c.
`
Зверніть увагу на підключення. Ви використовуєте лапки (`util.h' ), а не кутові дужки ( ). Кутові дужки зарезервовані для системних бібліотек, що знаходяться у стандартних директоріях. Лапки говорять компілятор шукати файл у поточній директорії.
Тут є тонка безпекова функція. Змінна rand_seed визначена у файлі .c, але не у файлі .h. Це приховування інформації.
Програми, що включають util.h, знають про rand(). Вони не знають про rand_seed. Вони можуть випадково змінити seed (початкове значення). Якщо ви бажаєте забезпечити це строго, ви можете додати ключове слово static перед int rand_seed. Це зробить змінну видимою лише всередині цього файлу.
Використання бібліотеки
Ваша основна програма не потребує реалізації. Їй потрібен лише інтерфейс.
Створіть main.c.
`
Перевага очевидна. Основна логіка стає коротшою. Ви не захаращуєте основний код алгоритмами сортування або генераторами випадкових чисел. Ви просто викликаєте їх.
Компіляція та лінківка
Тут більшість новачків спотикаються. Ви не можете компілювати все відразу, якщо хочете отримати окремі файли. Вам потрібно компілювати їх окремо, а потім лінкувати.
Припускаючи, що ви працюєте в системі, схожій на UNIX, це робочий процес.
Спочатку скомпілюйте вихідний код бібліотеки в об’єктний файл.
`
Прапор -c каже GCC компілювати, але не лінкувати. Він зупиняється після створення машинного коду. Прапор -g додає символи налагодження, що корисно, якщо щось піде не так. Результатом стане файл util.o. Цей файл містить скомпільований машинний код для rand та bubble_sort. Він може виконуватися самостійно, оскільки у ньому відсутня функція main.
Потім скомпілюйте основну програму.
`
Це створює файл main.o. Знову ж таки, це просто машинний код. Це файл, що ще не виконується.
Зрештою, зв’яжіть їх разом.
`
Ця команда бере main.o і util.o і об’єднує їх в один файл, що виконується, з ім’ям main.
Запустіть його за допомогою:
`
Ви побачите список із десяти випадкових чисел, за яким слідує роздільник у вигляді тире, а потім відсортований список.
Чому це важливо
Ви можете спитати: навіщо морочитися з цим додатковим кроком? Чому б просто не вставити функції в main.c?
Бо бібліотеки масштабуються. У міру зростання ваших проектів у вас буде десятки функцій утиліт. Зберігання в окремих файлах дозволяє перевикористовувати їх у різних проектах.



















