Чому нам потрібно написати файл заголовка?


12

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

Я студент, що здобуває ступінь нижчого рівня, мета C для курсу інформатики з мобільного розвитку. Я знаю, що в академічних умовах багато реальних міркувань не потрібні, оскільки ви будуєте менші проекти, працюєте в менших колективах тощо.

Але наш професор вимагає - і XCode підтримує - .h заголовні файли для кожного файлу реалізації .m. Мені це виглядає як зайнята робота. Я повинен переконатися, що я копіюю всі підписи методу та змінну екземпляра в інший файл. Якщо я зміню один файл, я повинен переконатися, що він відповідає іншому. Здається, це просто купа дрібних роздратовань.

Але я знаю, що для файлів заголовків у реальному використанні має бути якесь використання. Прекрасна відповідь стосується обох:

  1. Чим корисний файл заголовка для того, що файл реалізації не підходить? Яке його призначення?
  2. Чому ми як програмісти повинні вручну писати наші заголовкові файли? Схоже, їх можна було легко генерувати автоматично.

Спасибі заздалегідь!


Чи підтримує XCode автоматичний рефакторинг, щоб у разі зміни підпису в заголовку він автоматично поширювався на реалізацію (і навпаки)? А може, є плагін, який підтримує це? Я знаю, що це болісно робити вручну.
FrustratedWithFormsDesigner

Перша моя реакція, коли я дізнався про файли заголовків, - це "повинен бути спосіб зробити це автоматично". Я був дуже спантеличений, коли намагався шукати інструмент, який би допоміг із цим, і не знайшов великих, очевидних виборів.
Хартлі Броді

Я здивований, що такої функціональності не існує. Я знаю, що Eclipse може зробити такий рефакторинг для Java, я не знаю, чи плагіни C / C ++ можуть робити рефакторинг заголовків / імпульсів. Я думаю, якщо для XCode такого інструменту не існує, це може бути щось, що варто розробити. ;)
FrustratedWithFormsDesigner

Відповіді:


9
  1. Коротко;

    • Файл заголовка визначає API для модуля. Це перелік договорів, якими методами може зателефонувати третя сторона. Модуль можна вважати чорним ящиком для третіх осіб.

    • Реалізація реалізує модуль. Це внутрішня сторона чорної скриньки. Як розробник модуля ви повинні це написати, але як користувач стороннього модуля вам нічого не потрібно знати про реалізацію. Заголовок повинен містити всю необхідну інформацію.

  2. Деякі частини файлу заголовка можуть бути створені автоматично - декларації методу. Це вимагатиме від вас анотації реалізації, оскільки, ймовірно, в реалізації є приватні методи, які не є частиною API та не належать до заголовка.

Файли заголовків інколи містять іншу інформацію в них; визначення типів, постійні визначення тощо. Вони належать до файлу заголовка, а не до реалізації.


Але коли б хтось опинився в ситуації, коли їм потрібно було використовувати мій код, але мав доступ лише до файлу .h? Хіба їм ще не потрібна .m для запуску?
Хартлі Броді

1
Я розумію необхідність абстрагування на теоретичному рівні, якщо ви зміните деталі реалізації, але я просто не впевнений, коли виникне така ситуація.
Хартлі Броді

10
Іноді, зазвичай, з комерційних причин, ви можете дозволити комусь використовувати ваш код, але не мати доступу до вашої реалізації. У цьому випадку ви надасте файл заголовка та бібліотеку або код об'єкта, який вже був складений.
Люк Грем

А-а, я бачу. Якби не вважали, код буде вже скомпільований, таким чином, його можна використовувати, але не читати. Дякую!
Хартлі Броді

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

5

Основна причина заголовка - це можливість мати #includeйого в якомусь іншому файлі, тому ви можете використовувати функції одного файлу з іншого файла. Заголовок містить (лише) достатньо, щоб можна було використовувати функції, а не самі функції, тому (сподіваємось) їх складання значно швидше.

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


2

Включення заголовка дозволяє вашому коду викликати функції або методи, записані в іншому місці, які можуть бути, а можуть і не бути частиною вашого програмного проекту / складання, але які можуть бути знайдені "лінкером" при складанні програмного забезпечення.

Наприклад, коли ви викликаєте функцію в стандартній бібліотеці С, тоді вам не потрібно вводити всі внутрішні функції цієї функції у ваш проект - ви просто очікуєте, що ваша програма зможе викликати її.

Але вашому компілятору потрібно сказати, що функція існує десь, навіть якщо він не бачить код, і заголовок робить це. Коли компілятор закінчений, викликується лінкер, і він виглядає як "посилання" тих бітів вашого коду, які залишилися звисаючими, наприклад, виклики бібліотеки.


1

Файли заголовків в основному використовуються для оголошення та включення підписів (тобто ім'я функції, повернене значення та аргументи) ваших функцій в інших файлах. Компілятору необхідно знати ці підписи під час збирання та зв’язування ваших файлів разом.

Прочитайте цю статтю для отримання додаткової інформації.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.