Яка різниця між файлом заголовка та бібліотекою?


80

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


1
C і C ++ - це різні мови програмування. І обидва - це специфікації - не програмне забезпечення! - написано (переважно англійською мовою) якимось стандартом, наприклад n1570 для C та n3337 для C ++
Basile Starynkevitch

Відповіді:


126

Подумайте про обидва так (Застереження: це дійсно аналогія високого рівня;) ..

  • Тема є телефонний номер , ви можете зателефонувати, в той час як ...
  • ... бібліотека - це справжня людина, до якої ви можете зв’язатися!

Це принципова різниця між "інтерфейсом" та "реалізацією"; інтерфейс (заголовок) говорить вам , як назвати деякі функціональні можливості (не знаючи , як це працює), в той час як реалізація (бібліотека) є фактичною функціональністю.

Примітка: Концепція настільки фундаментальна, оскільки вона дозволяє вам гнучко: ви можете мати один і той же заголовок для різних бібліотек (тобто функціональність точно викликається однаково), і кожна бібліотека може реалізовувати функціональність по-різному. Зберігаючи той самий інтерфейс, ви можете замінити бібліотеки, не змінюючи свій код.

І: ви можете змінити реалізацію бібліотеки, не порушуючи викличний код!


2
Е-е ... я все ще чогось тут не отримую. По-перше, я навіть не зовсім впевнений, як виводяться бібліотеки, всі програми, які я скомпілював, здається, не потрібні - вони просто не створюються. Я припускаю, що бібліотеки потрібно визначити? Але, ігноруючи це, звідки вступають у дію основні файли (джерела)? Я думав, що заголовки призначені для реалізації, а основні вихідні файли - для інтерфейсу - бібліотеки були потрібні лише для компіляції виконуваного файлу ... Якщо вони статичні, то все одно.
Xonara

2
Бібліотеки ПРОГРАМУВАНІ: Ви можете написати програму або написати бібліотеку.
TomTom

2
Якщо я отримав бібліотеку від інших. Приклад Util.libЯк я називаю це функцією? Чи потрібно мені включати файли заголовків, які також стосуються U til.lib?
Ельшан,

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

57

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

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

В об'єктно-орієнтованій мові, як C ++, заголовочний файл, як правило, містить наступне:

  • Опис класу та ієрархія успадкування
  • Члени та типи даних класу
  • Методи занять

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

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


Бібліотека являє собою набір коду , який ви хочете зробити доступним для програми або групи програм. Він включає реалізацію певного інтерфейсу або набору інтерфейсів.

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

  • Статично пов'язані бібліотеки визначає набір символів експорту (які можна розглядати в якості визначень методів) , які потім пов'язані в кінцевий виконуваний файл (.exe) під час зв'язує стадії процесу складання. Він має перевагу у швидшому виконанні (оскільки бібліотеку не потрібно динамічно завантажувати), за рахунок більшої двійкової системи (оскільки методи по суті реплікуються у виконуваному файлі).

  • Динамічно пов'язана бібліотека пов'язана під час виконання програми, а не пов'язання програми. Це корисно, коли для кількох програм потрібно повторно використовувати однакові методи і широко використовується в таких технологіях, як COM.


10

Вас може бентежити те, що бібліотека слів може мати кілька значень у C ++. Тут добре обговорено одне значення:

Набір функцій у двійковому файлі. Вони можуть бути статично пов’язані або динамічно пов’язані.

Але існує і інший тип бібліотеки: так звані бібліотеки лише для заголовків (включаючи частини STL, TR1 та Boost). Вони не існують в окремій двійковій формі, тому бібліотека слів посилається не на певний двійковий файл, а на набір включених файлів заголовків.

Сподіваюся, це допомагає.


8

Бібліотека - це код, компільований у набір об’єктних файлів. Файли об’єктів містять скомпільований машинний код та декларації даних, що використовуються кодом.

Файл заголовка визначає інтерфейс бібліотеки: він розповідає, як правильно користуватися бібліотекою. У C / C ++ файл заголовка надає вам перелік назв функцій та способи виклику цих функцій: кількість та типи параметрів, які вони приймають, тип повернення, умова викликів тощо. У файлах заголовків є багато іншого їх теж, але врешті-решт, це зводиться до набору правил для виклику коду бібліотеки.



2

Якщо Бібліотека мовами програмування є загальною бібліотекою, то багато книг, присутніх у бібліотеці, можна порівняти з функціями / методами мов. А також файли заголовків можна порівняти з номером рядка книги. Припустимо, є книга в якійсь бібліотеці в Хайдарабаді і в цій бібліотеці ця книга присутня в рядку № 24 ... Так само, як вказана адреса бібліотеки за допомогою простору імен std (для стандартної бібліотеки) і рядок No задається файлом заголовка, де виставляються всі книги (в даному випадку методи) (всі методи, пов'язані з потоками вводу / виводу)


2

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

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


1

Файл заголовка описує, як викликати функціонал , бібліотека містить скомпільований код, який реалізує цю функціональність.


1

HEADER FILE - це те, в якому написано оголошення функції. За допомогою заголовного файлу ми можемо отримати доступ до певної функції

поки

БІБЛІОТЕЧНИЙ ФАЙЛ - це те, в якому записано визначення певної функції. MATH.H - це ЗАГОЛОВНИЙ ФАЙЛ, тоді як MATH.LIB - це файл бібліотеки.


1

Робота файлу HEADER та БІБЛІОТЕКИ в програмі.

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

Дякуємо за читання!


1

Я думаю, що бібліотека - це пакет коду, який багаторазово використовується багато разів, і цей код попередньо скомпільований, отже, він доступний у стандартній формі, тому нам не потрібно писати цей код для кожної програми, яку ми розробляємо. І файл заголовка містить посилання на цей код простим способом, функції, які ми використовуємо в нашій програмі, такі як "cin" і "cout", повністю визначені в стандартній бібліотеці, а файли заголовків, такі як файл заголовка iostream, містять посилання на цей код. Отже, коли ми компілюємо наш код, ми просто отримуємо попередньо скомпільований для cin і cout, і нам не потрібно писати код для cin і cout щоразу, коли ми його використовуємо. Або більш простим способом ми можемо сказати, що бібліотека містить коди для всіх функцій, а файл заголовка - це спосіб досягти цього коду.


1

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

Файл заголовка - це місце розташування (інтерфейс) бібліотеки


0

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


0

Бібліотеки схожі на мертві мумії, обмотані білими довгими нитками. Вони мертві. Єдиний спосіб їх випустити - це заголовні файли. Файли заголовків містять способи, як оживити їх, і їх можна оживити багато разів (повторне використання коду).


2
Ця аналогія трохи ... занадто абстрактна.
byxor

0

Ви можете розглянути цей приклад зрозуміти- Math.hфайл заголовка , який містить прототип для викликів функцій , таких як sqrt(), і pow()т.д., в той час як libm.lib, libmmd.lib, libmmd.dllдеякі з математичних бібліотек. Якщо говорити простими словами, файл заголовка схожий на візитну картку, а бібліотеки - як справжня людина, тому ми використовуємо візитну картку (файл заголовка), щоб дістатись до фактичної особи (Бібліотеки).


-4

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


Ласкаво просимо до StackOverflow та дякуємо за спробу допомогти. Однак ваша відповідь може отримати корисність, якщо ви переформулюєте її для ясності та читабельності. Використання деякої наценки для форматування може бути корисним. Різниця між заголовками та бібліотеками має інші, більш важливі аспекти, ніж те, скільки з них зберігається.
Юннош
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.