В чем разница между заголовочным файлом и библиотекой? - PullRequest
68 голосов
/ 29 мая 2009

Мне сложно понять, как работает компилятор. У меня много трудностей с этим, но, в частности, я постоянно путаю заголовки и библиотеки. Если бы кто-то мог кое-что прояснить, это было бы здорово.

Ответы [ 16 ]

109 голосов
/ 29 мая 2009

Думайте об обоих так (Отказ от ответственности: это действительно аналогия высокого уровня;) ..

  • Заголовок - это номер телефона, по которому можно позвонить, а ...
  • ... библиотека - это реальный человек, которого вы можете найти там!

Это принципиальное различие между «интерфейсом» и «реализацией»; интерфейс (заголовок) сообщает , как вызвать некоторую функциональность (не зная, как она работает), тогда как реализация (библиотека) является реальной функциональностью. 1019 *

Примечание. Эта концепция является фундаментальной, поскольку она обеспечивает гибкость: вы можете иметь один и тот же заголовок для разных библиотек (т. Е. Функциональность точно вызывается одинаково), и каждая библиотека может реализовать функциональность по-другому. Сохраняя тот же интерфейс, вы можете заменить библиотеки без изменения вашего кода.

И: вы можете изменить реализацию библиотеки, не нарушая вызывающий код!

50 голосов
/ 29 мая 2009

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

Например, если вы оптимизировали программу, вы, скорее всего, изменили бы исходный файл (.cpp) для улучшения алгоритма, но файл заголовка не изменился бы, потому что внешние клиенты по-прежнему вызывают методы, используя тот же набор параметров и возвращаемых значений.

В объектно-ориентированном языке, таком как C ++, файл заголовка обычно включает следующее:

  • Описание класса и иерархия наследования
  • Элементы данных класса и типы
  • Методы класса

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

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


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

Код определен в библиотеке, чтобы предотвратить дублирование кода и способствовать его повторному использованию. Библиотека может быть статически связанной (.lib) или динамически связанной (.dll):

  • A статически связанная библиотека определяет набор экспортных символов (которые можно рассматривать как определения методов), которые затем связываются с конечным исполняемым файлом (.exe) на этапе компоновки процесс сборки. Преимущество заключается в более быстром времени выполнения (поскольку библиотека не нуждается в динамической загрузке) за счет большего двоичного кода (поскольку методы по существу реплицируются в исполняемом файле).

  • динамически связанная библиотека связывается во время выполнения программы, а не при связывании программы. Это полезно, когда нескольким программам необходимо повторно использовать одни и те же методы, и широко используется в таких технологиях, как COM.

9 голосов
/ 29 мая 2009

Одна вещь, которая может сбить вас с толку, заключается в том, что слово library может иметь несколько значений в C ++. Одно значение было хорошо обсуждено здесь:

Связываемый набор функций в двоичном файле. Они могут быть статически или динамически связаны.

Но есть и другой тип библиотеки: так называемые библиотеки только для заголовков (включая части STL, TR1 и Boost). Они не существуют в отдельной двоичной форме, поэтому слово library относится не к конкретному двоичному файлу, а к набору включенных заголовочных файлов.

Надеюсь, это поможет.

7 голосов
/ 29 мая 2009

Заголовок содержит только объявление, тогда как библиотеки также содержат реализацию.

7 голосов
/ 29 мая 2009

Библиотека - это код, скомпилированный в набор объектных файлов. Объектные файлы содержат скомпилированный машинный код и объявления данных, используемые кодом.

Заголовочный файл определяет интерфейс для библиотеки: он говорит вам, как правильно использовать библиотеку. В C / C ++ заголовочный файл содержит список имен функций и способов их вызова: количество и типы параметров, которые они принимают, тип возвращаемого значения, соглашение о вызовах и т. Д. В заголовочных файлах есть много других вещей их тоже, но, в конце концов, все сводится к набору правил для вызова библиотечного кода.

2 голосов
/ 04 марта 2013

Если библиотека на языках программирования является общей библиотекой, то многие книги, представленные в библиотеке, можно сравнить с функциями / методами на языках. А также заголовочные файлы можно сравнить с номером строки книги Предположим, что в какой-то библиотеке в Хайдарабаде есть книга, и в этой библиотеке эта книга находится в строке № 24 ... Точно так же адрес библиотеки задается с использованием пространства имен std (для стандартной библиотеки), а номер строки задается файлом заголовка, где все книги (в данном случае методы) того же времени (все методы связаны с потоками ввода / вывода). ) выставлены

1 голос
/ 25 августа 2016

Библиотека - это набор похожих объектов для случайного использования. Обычно он содержит программы в форме объекта или исходного кода, шаблоны и т. Д.

Заголовочный файл - это расположение (интерфейс) библиотеки

1 голос
/ 30 декабря 2014

Я считаю библиотеку пакетом кода, который многократно используется, и этот код предварительно скомпилирован, поэтому он доступен в стандартной форме, так что нам не нужно писать этот код для каждой разрабатываемой нами программы. И заголовочный файл содержит ссылку на этот код простым способом, и функции, которые мы используем в нашей программе, такие как «cin» и «cout», полностью определены в стандартной библиотеке, а заголовочные файлы, такие как заголовочный файл iostream, содержат ссылку на этот код. Поэтому, когда мы компилируем наш код, мы просто получаем предварительно скомпилированный код для cin и cout, и нам не нужно писать код для cin и cout каждый раз, когда мы его используем. Или, проще говоря, мы можем сказать, что библиотека содержит коды для всех функций, а заголовочный файл - это способ получить этот код.

1 голос
/ 28 января 2014

Работа с файлом HEADER и БИБЛИОТЕКОЙ в программе.

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

Спасибо за чтение!

1 голос
/ 17 января 2014

HEADER FILE - это файл, в котором написано объявление функции. Используя заголовочный файл, мы можем получить доступ к определенной функции

, а

ФАЙЛ БИБЛИОТЕКИ - это тот, в котором написано определение конкретной функции. MATH.H - файл заголовка, а MATH.LIB - файл библиотеки.

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