Так работают файлы заголовка / реализации? - PullRequest
0 голосов
/ 26 марта 2012

Я задавал этот вопрос ранее, я читал ответы и искал дополнительную информацию о заголовочных файлах и файлах реализации. Исходя из Java, я не видел этого разделения раньше, и мне интересно, правильно ли я его понял, так что вот оно:

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

Вместо того, чтобы хранить их в источнике реализации, они перемещаются в собственный файл (заголовок). Этот заголовочный файл вместо этого включен в препроцессор и вместо этого копируется / вставляется машиной. Файл заголовка может также включать другие заголовки, но я читал кое-что о включении других заголовков в основной файл вместо этого?

Затем исходный файл компилируется. А потом это связано. Это правильно?

1 Ответ

0 голосов
/ 26 марта 2012

В значительной степени. Среды IDE, используемые для разработки на C # и Java (и на динамических языках также и интерпретатор, например, Ruby), динамически создают список функций, доступных в данном классе, на основе определения класса (в частности, на основе модификаторов public / private / protected) , В ObjectiveC у нас нет этих модификаторов (или, по крайней мере, до недавнего времени), и файл .h по сути является способом перечисления только тех переменных и методов, которые должны использоваться другими классами.

Другими словами, компилятор использует файлы .h для кэширования объявлений, доступных для других классов (включая дочерние классы, которые наследуют эти объявления от базового класса).

Тем не менее, это не вся картина, потому что в ObjectiveC методы вызываются динамически. Например, вам не нужно указывать объявление в файле .h, чтобы другой класс мог вызывать метод, определенный только в файле .m. В Java ссылки на конкретные методы разрешаются во время компиляции. Когда метод не определен, другой код не может вызвать его. В ObjectiveC, когда фрагмент кода вызывает метод, он фактически отправляет сообщение классу для выполнения этого метода. Во время выполнения диспетчер проверяет, отвечает ли объект на это сообщение, и если да, вызывает этот метод. Это конечно упрощение. Посетите страницу Википедии о ObjectiveC для более подробной информации (особенно в разделе Сообщения).

Разделение между объявлением и определением происходит от C. Одна функция или переменная может иметь много объявлений, но только одно определение. Когда файл .h импортируется в начале файла .m, его содержимое эффективно добавляется в этот файл .m во время компиляции (вместе с другими файлами .h, на которые есть ссылки в этих файлах). Если, например, файл a.m должен был быть импортирован в файлы b.m и c.m, то, фактически, во время компиляции и b.m, и c.m будут иметь дублированные определения переменных и методов, определенных в a.m (например, переменная определенный в a.m будет храниться по разным адресам, когда a.m будет импортирован и затем скомпилирован в b.m или c.m).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...