Зачем нам нужно писать заголовочный файл?

12

Я знаю, до того, как вы выкроите свои язвительные комментарии, это вопрос нуби. Я впервые использую язык Си.

Я студент, изучающий Objective C для компьютерного курса по разработке мобильных приложений. Я знаю, что в академической обстановке многие реальные соображения не нужны, поскольку вы создаете небольшие проекты, работаете в небольших командах и т. Д.

Но наш профессор требует - и XCode поддерживает - заголовочные файлы .h для каждого файла реализации .m. Для меня это похоже на занятую работу. Я должен убедиться, что я копирую каждую сигнатуру метода и переменную экземпляра в другой файл. Если я изменяю один файл, я должен убедиться, что он соответствует другому файлу. Кажется, что это просто куча маленьких неприятностей.

Но я знаю, что для заголовочных файлов должно быть какое - то реальное использование. Отличный ответ будет касаться обоих:

  1. Для чего нужен заголовочный файл, для которого файл реализации не подходит? Какова его цель?
  2. Почему мы, программисты, должны вручную писать наши заголовочные файлы? Кажется, что они могут быть легко созданы автоматически.

Заранее спасибо!

Хартли броди
источник
Поддерживает ли XCode автоматический рефакторинг, чтобы при изменении подписи в заголовке она автоматически распространялась на реализацию (и наоборот)? Или, может быть, есть плагин, который поддерживает это? Я знаю, что это больно делать вручную.
FrustratedWithFormsDesigner
Моя первая реакция, когда я узнал о заголовочных файлах: «Должен быть способ сделать это автоматически». Я был довольно озадачен, когда попытался найти инструмент, который бы помог с этим, и не нашел ни одного замечательного, очевидного выбора.
Хартли Броуди
Я удивлен, что такой функциональности не существует. Я знаю, что Eclipse может выполнять такой рефакторинг для Java, я не знаю, могут ли плагины C / C ++ выполнять рефакторинг header / impl. Я полагаю, что если для XCode такого инструмента не существует, возможно, стоит что-то разработать. ;)
FrustratedWithFormsDesigner

Ответы:

9
  1. Вкратце;

    • Заголовочный файл определяет API для модуля. Это список контрактов, методы которого могут вызывать третьи стороны. Модуль можно считать черным ящиком для третьих лиц.

    • Реализация реализует модуль. Это внутренняя часть черного ящика. Как разработчик модуля вы должны написать это, но как пользователь стороннего модуля вам не нужно ничего знать о реализации. Заголовок должен содержать всю необходимую информацию.

  2. Некоторые части файла заголовка могут быть сгенерированы автоматически - объявления методов. Это потребует от вас аннотирования реализации, поскольку в реализации могут быть частные методы, которые не являются частью API и не входят в заголовок.

Заголовочные файлы иногда содержат другую информацию; определения типов, определения констант и т. д. Они находятся в заголовочном файле, а не в реализации.

Люк Грэм
источник
Но когда кто-то окажется в ситуации, когда ему нужно будет использовать мой код, но иметь доступ только к файлу .h? Разве им не понадобится .m для запуска?
Хартли Броуди
1
Я понимаю необходимость абстракции на теоретическом уровне, если вы меняете детали реализации, но я просто не уверен, когда возникнет такая ситуация.
Хартли Броуди
10
Иногда, обычно по коммерческим причинам, вы можете разрешить кому-то использовать ваш код, но не иметь доступа к вашей реализации. В этом случае вы должны предоставить заголовочный файл и библиотечный или объектный код, который уже скомпилирован.
Люк Грэм
АА, вижу. Не считал, что код уже будет скомпилирован, поэтому его можно будет использовать, но он не будет читаемым. Благодаря!
Хартли Броуди
3
Кроме того, почему я хотел бы прочитать реализацию, чтобы знать, как использовать ваш код? Этого должно быть достаточно, чтобы прочитать файл заголовка.
Пер Йоханссон
5

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

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

Джерри Гроб
источник
2

Включение заголовка позволяет вашему коду вызывать функции или методы, которые написаны в другом месте и которые могут быть или не быть частью вашего программного проекта / сборки, но которые могут быть найдены «компоновщиком» при сборке программного обеспечения.

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

Но вашему компилятору нужно сказать, что функция где-то существует, даже если она не может видеть код, и это делает заголовок. Когда компилятор завершает работу, вызывается компоновщик, и он пытается «связать» те биты вашего кода, которые остаются висящими, например, вызовы библиотеки.

adrianmcmenamin
источник
1

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

Прочитайте эту статью для получения дополнительной информации.

Бернард
источник