Eines der Dinge, die ich nur schwer verstehen kann, ist die Funktionsweise des Compilers. Ich habe viele Schwierigkeiten damit, aber insbesondere verwechsle ich immer wieder Header und Bibliotheken. Wenn jemand die Dinge ein bisschen aufklären könnte, wäre das großartig.
79
Antworten:
Stellen Sie sich beides so vor (Haftungsausschluss: Dies ist eine wirklich hochrangige Analogie;).
Es ist der grundlegende Unterschied zwischen "Schnittstelle" und "Implementierung"; Die Schnittstelle (Header) zeigt Ihnen, wie Sie einige Funktionen aufrufen (ohne zu wissen, wie sie funktionieren), während die Implementierung (Bibliothek) die eigentliche Funktionalität ist.
Hinweis: Das Konzept ist so grundlegend, weil es Ihnen Flexibilität bietet: Sie können denselben Header für verschiedene Bibliotheken verwenden (dh die Funktionalität wird genau auf dieselbe Weise aufgerufen), und jede Bibliothek kann die Funktionalität auf unterschiedliche Weise implementieren . Wenn Sie dieselbe Schnittstelle beibehalten, können Sie die Bibliotheken ersetzen, ohne Ihren Code zu ändern .
Und: Sie können die Implementierung der Bibliothek ändern, ohne den aufrufenden Code zu beschädigen!
quelle
Util.lib
Wie nenne ich die Funktion? Muss ich die Header-Dateien einschließen, die auch für U relevant sindtil.lib
?Eine Header-Datei wird im Allgemeinen verwendet, um eine Schnittstelle oder einen Satz von Schnittstellen innerhalb einer Anwendung zu definieren. Stellen Sie sich eine Header-Datei als etwas vor, das die externe Funktionalität eines Programms zeigt, während die Details der technischen Implementierung weggelassen werden.
Wenn Sie beispielsweise ein Programm optimieren, würden Sie höchstwahrscheinlich die Quelldatei (.cpp) ändern, um den Algorithmus zu verbessern, aber die Header-Datei würde sich nicht ändern, da externe Clients die Methoden immer noch mit denselben Parametern und aufrufen Rückgabewerte.
In einer objektorientierten Sprache wie C ++ enthält eine Header-Datei im Allgemeinen Folgendes:
Es gibt zwar nichts, was die Implementierung von Code in einer Header-Datei verhindert, dies wird jedoch im Allgemeinen nicht bevorzugt, da dies zusätzliche Kopplungen und Abhängigkeiten im Code verursachen kann.
In einigen Fällen (z. B. Vorlagenklassen) muss die Implementierung aus technischen Gründen in der Header-Datei definiert werden.
Eine Bibliothek ist eine Code-Sammlung, die Sie einem Programm oder einer Gruppe von Programmen zur Verfügung stellen möchten. Es umfasst die Implementierung einer bestimmten Schnittstelle oder eines Satzes von Schnittstellen.
Code wird in einer Bibliothek definiert, um das Duplizieren von Code zu verhindern und die Wiederverwendung zu fördern. Eine Bibliothek kann statisch verknüpft (.lib) oder dynamisch verknüpft (.dll) sein:
Eine statisch verknüpfte Bibliothek definiert eine Reihe von Exportsymbolen (die als Methodendefinitionen betrachtet werden können), die dann während der Verknüpfungsphase des Erstellungsprozesses mit der endgültigen ausführbaren Datei (.exe) verknüpft werden. Es hat den Vorteil einer schnelleren Ausführungszeit (da die Bibliothek nicht dynamisch geladen werden muss) auf Kosten einer größeren Binärdatei (da die Methoden im Wesentlichen in der ausführbaren Datei repliziert werden).
Eine dynamisch verknüpfte Bibliothek wird während der Ausführung eines Programms und nicht während der Verknüpfung eines Programms verknüpft. Dies ist nützlich, wenn mehrere Programme dieselben Methoden erneut verwenden müssen, und wird häufig in Technologien wie COM verwendet.
quelle
Eine Sache , die Sie verwirrend sein kann , ist , dass das Wort Bibliothek mehrere Bedeutungen in C ++ haben. Eine Bedeutung wurde hier gut diskutiert:
Ein verknüpfbarer Satz von Funktionen in einer Binärdatei. Diese können statisch oder dynamisch verknüpft sein.
Es gibt jedoch einen anderen Bibliothekstyp: sogenannte Nur-Header-Bibliotheken (einschließlich Teilen von STL, TR1 und Boost). Diese existieren nicht in einer separaten binären Form so das Wort Bibliothek nicht auf eine bestimmte binäre Datei beziehen , sondern auf eine Reihe von Header - Dateien enthalten.
Hoffe das hilft.
quelle
Eine Bibliothek ist Code, der in eine Reihe von Objektdateien kompiliert wird. Die Objektdateien enthalten den kompilierten Maschinencode und die vom Code verwendeten Datendeklarationen.
Eine Header-Datei definiert die Schnittstelle zu einer Bibliothek: Sie zeigt Ihnen, wie Sie die Bibliothek richtig verwenden. In C / C ++ enthält eine Header-Datei eine Liste mit Funktionsnamen und Informationen zum Aufrufen dieser Funktionen: Anzahl und Art der verwendeten Parameter, Rückgabetyp, Aufrufkonvention usw. Header-Dateien enthalten viele andere Elemente auch sie, aber am Ende läuft es auf eine Reihe von Regeln für den Aufruf von Bibliothekscode hinaus.
quelle
Der Header enthält nur die Deklaration, während die Bibliotheken auch die Implementierung enthalten.
quelle
Wenn die Bibliothek in Programmiersprachen eine allgemeine Bibliothek ist, können viele in der Bibliothek vorhandene Bücher mit Funktionen / Methoden in Sprachen verglichen werden. Außerdem können Header-Dateien mit der Zeilennummer des Buches verglichen werden. Angenommen, in einer Bibliothek in Hyderabad befindet sich ein Buch, und in dieser Bibliothek befindet sich dieses Buch in Zeile 24 ... Auf die gleiche Weise wird die Adresse der Bibliothek angegeben unter Verwendung des Namespace std (für Standardbibliothek) und Zeile Nr. wird durch die Header-Datei angegeben, in der alle Bücher (in diesem Fall Methoden) derselben Zeit (alle Methoden, die sich auf Eingabe- / Ausgabestreams beziehen) abgelegt werden
quelle
Eine Header-Datei beschreibt, wie die Funktionalität aufgerufen wird. Eine Bibliothek enthält den kompilierten Code, der diese Funktionalität implementiert.
quelle
HEADER FILE ist die Datei, in die die Deklaration einer Funktion geschrieben wird. Mithilfe der Header-Datei können wir auf eine bestimmte Funktion zugreifen
während
LIBRARY FILE ist die Datei, in die die Definition einer bestimmten Funktion geschrieben ist. MATH.H ist eine HEADER-DATEI, während MATH.LIB eine Bibliotheksdatei ist.
quelle
Arbeiten von HEADER-Datei und BIBLIOTHEK in einem Programm.
Eine Header-Datei enthält die Links zu Bibliotheken (Bibliotheken enthalten Standardfunktionen und -methoden). Ein Compiler erkennt die im Quellcode verwendeten Standardfunktionen über einen Präprozessor, der alle Anweisungen auflöst (Anweisungen sind die Zeilen im Programm, denen ein # -Zeichen vorangestellt ist ) vor der eigentlichen Zusammenstellung des Programms.
Danke fürs Lesen!
quelle
Ich denke, Bibliothek ist ein Codepaket, das viele Male wiederverwendet wird und das vorkompiliert ist. Daher ist es in Standardform verfügbar, damit wir diesen Code nicht für jedes Programm schreiben müssen, das wir entwickeln. Und die Header-Datei enthält auf einfache Weise den Verweis auf diesen Code. Die Funktionen, die wir in unserem Programm verwenden, wie "cin" und "cout", sind vollständig in einer Standardbibliothek definiert, und Header-Dateien wie die iostream-Header-Datei enthalten den Verweis auf diesen Code. Wenn wir also unseren Code kompilieren, erhalten wir nur den vorkompilierten Code für cin und cout, und wir müssen den Code für cin und cout nicht jedes Mal schreiben, wenn wir ihn verwenden. Oder einfacher gesagt können wir sagen, dass eine Bibliothek Codes für alle Funktionen enthält und eine Header-Datei der Weg ist, um diesen Code zu erreichen.
quelle
Eine Bibliothek ist eine Sammlung ähnlicher Objekte zur gelegentlichen Verwendung. Es enthält normalerweise Programme in Objekt- oder Quellcodeform, Vorlagen usw.
Eine Header-Datei ist der Speicherort (Schnittstelle) der Bibliothek
quelle
Der Header wird normalerweise verwendet, um die Prototypen zu enthalten. Header werden zur Vorverarbeitungszeit erweitert, sodass der Code zur Kompilierungszeit möglicherweise Zugriff auf relevante Funktionsdeklarationen / Prototypen hat.
Bibliothek ist die eigentliche Software, die die Definitionen der Funktionsprototypen enthält (im Header vorhanden). Die Bibliothek wird zur Verbindungszeit verwendet. Die Definitionen (in der Bibliothek vorhanden) werden zum Zeitpunkt der Verknüpfung aufgelöst.
quelle
Um einen klassischen Witz zu paraphrasieren, besteht der Unterschied darin, dass die Bibliothek eine Header-Datei hat, während die Header-Datei keine Bibliothek hat.
quelle
Bibliotheken sind wie tote Mumien, eingewickelt in weiße lange Fäden. Sie sind tot. Die einzige Möglichkeit, sie freizugeben, besteht in Header-Dateien. Header-Dateien enthalten Möglichkeiten, sie zum Leben zu erwecken, und sie können viele Male zum Leben erweckt werden (Wiederverwendung von Code).
quelle
Sie können dieses Beispiel betrachten , um Verständnis
Math.h
eine Header - Datei, die den Prototyp für Funktionsaufrufe wie beinhaltetsqrt()
,pow()
etc, währendlibm.lib
,libmmd.lib
,libmmd.dll
einige der Mathematikbibliotheken sind. In einfachen Worten ist eine Header-Datei wie eine Visitenkarte und Bibliotheken sind wie eine reale Person. Daher verwenden wir eine Visitenkarte (Header-Datei), um die tatsächliche Person (Bibliothek) zu erreichen.quelle
Code aus Bibliotheken wird nur nach Bedarf für eine Header-Datei gespeichert. Die gesamte Header-Datei wird gespeichert, wodurch Speicherplatz für den Prozessor gespart wird.
quelle