Heim > Backend-Entwicklung > C#.Net-Tutorial > Welche Beziehung besteht zwischen H-Dateien und C-Dateien?

Welche Beziehung besteht zwischen H-Dateien und C-Dateien?

醉折花枝作酒筹
Freigeben: 2023-01-07 11:41:07
Original
14841 Leute haben es durchsucht

h-Dateien werden oft am Kopf von .c-Dateien (.cpp) platziert, daher werden sie „Header-Dateien“ genannt. Die h-Datei ist eine Datei, die die wiederholten Deklarationsanweisungen aus der .c-Datei extrahiert, sie in eine neue Datei einfügt und dann eine Anweisung wie „#include XXXX“ in die erforderliche .c-Datei (.cpp) eingibt.

Welche Beziehung besteht zwischen H-Dateien und C-Dateien?Die Betriebsumgebung dieses Tutorials: Windows 7-System, C++17-Version, Dell G3-Computer.

Detaillierte Erläuterung der Beziehung zwischen .h-Dateien und .c-Dateien in C-Sprachprojekten

In der Zeit, als der Compiler nur .c-Dateien (.cpp) erkannte und nicht wusste, was .h war, waren die Menschen damals Ich habe viele .c-Dateien (.cpp) geschrieben. Nach und nach stellten die Leute fest, dass die Deklarationsanweisungen in vielen .c-Dateien (.cpp) gleich waren, aber sie mussten diesen Inhalt wiederholt einzeln in jedes Wort eingeben. .cpp)-Dateien. Noch erschreckender ist jedoch, dass bei einer Änderung einer der Deklarationen alle .c-Dateien (.cpp) überprüft werden müssen.

Also extrahieren die Leute die wiederholten Teile, fügen sie in eine neue Datei ein und geben dann Anweisungen wie #include XXXX in die erforderliche .c-Datei (.cpp) ein. Selbst wenn sich eine bestimmte Aussage ändert, ist es auf diese Weise nicht erforderlich, sie überall zu suchen und zu ändern. Da diese neue Datei oft am Kopf der .c-Datei (.cpp) platziert wird, wird sie „Header-Datei“ genannt und hat die Erweiterung .h.

In der Anfangsphase des Erlernens unserer Sprache verfügt unser Programm häufig nur über eine oder mehrere davon. Zu diesem Zeitpunkt haben wir selten Probleme mit der Organisation von Header-Dateien Zehntausende Zeilen wurden gemessen, auch die Anzahl der Dateien nimmt zu. Zu diesem Zeitpunkt wird die Organisation dieser Dateien zu einem Problem. Um es ganz klar auszudrücken: Die Organisation dieser Dateien ist theoretisch ein Problem des Moduldesigns in der Softwareentwicklung usw.

Eine kurze Beschreibung der Rolle von Header-Dateien:

(1) Rufen Sie Bibliotheksfunktionen über Header-Dateien auf. In vielen Fällen ist es unpraktisch (oder nicht erlaubt), den Quellcode an Benutzer weiterzugeben, solange den Benutzern die Header-Dateien und Binärbibliotheken zur Verfügung gestellt werden. Benutzer müssen nur Bibliotheksfunktionen gemäß der Schnittstellendeklaration in der Header-Datei aufrufen und müssen sich nicht um die Implementierung der Schnittstelle kümmern. Der Compiler extrahiert den entsprechenden Code aus der Bibliothek.

(2) Header-Dateien können Typsicherheitsprüfungen verstärken. Wenn eine Schnittstelle in einer Weise implementiert oder verwendet wird, die nicht mit der Deklaration in der Header-Datei übereinstimmt, weist der Compiler auf einen Fehler hin. Diese einfache Regel kann den Aufwand für das Debuggen und Korrigieren von Fehlern erheblich reduzieren.

Zum Beispiel definiere ich die Deklaration einer Funktion in aaa.h und erstelle dann aaa.c im selben Verzeichnis wie aaa.h. Die Implementierung dieser Funktion wird in aaa.c definiert und dann die Hauptfunktion befindet sich #include this aaa.h in der .c-Datei und dann kann ich diese Funktion verwenden. Wenn main ausgeführt wird, wird die Datei aaa.c gefunden, die diese Funktion definiert. Dies liegt daran, dass die Hauptfunktion der Programmeinstiegspunkt von Standard-C/C++ ist und der Compiler zuerst die Datei findet, in der sich die Funktion befindet.

Angenommen, der Compiler stellt beim Kompilieren von myproj.c (das main() enthält) fest, dass es mylib.h enthält (das die Funktion void test() deklariert), dann folgt der Compiler dem voreingestellten Pfad (Pfadliste einschließen). und der Pfad, in dem sich die Codedatei befindet) sucht nach einer Implementierungsdatei mit demselben Namen (Erweiterung .cpp oder .c, in diesem Fall mylib.c), wenn die Datei gefunden wird und die Funktion darin gefunden wird (in In diesem Fall handelt es sich um den Implementierungscode von void test(). Fahren Sie dann mit der Kompilierung fort.

Wenn die Implementierungsdatei nicht im angegebenen Verzeichnis gefunden werden kann oder der Implementierungscode nicht in der Datei und den nachfolgenden Include-Dateien gefunden wird, wird ein Kompilierungsfehler zurückgegeben. Tatsächlich kann der Include-Prozess als Datei „gesehen“ werden Beim Spleißprozess gibt es theoretisch keinen wesentlichen Unterschied, ob Deklaration und Implementierung in die Header-Datei bzw. die C-Datei geschrieben werden oder beide gleichzeitig in die Header-Datei geschrieben werden.

Theoretisch können Sie alles schreiben, solange der Inhalt in C-Dateien und Header-Dateien von der C-Sprache unterstützt wird. Wenn Sie beispielsweise einen Funktionskörper in eine Header-Datei schreiben, müssen Sie diese Header-Datei einbinden in jeder C-Datei Diese Funktion kann in einen Teil der Zieldatei kompiliert werden (die Kompilierung basiert auf C-Dateien. Wenn diese Header-Datei in keiner C-Datei enthalten ist, ist dieser Code nutzlos. Sie können die Funktion und Variablen in deklarieren). die C-Datei-Deklaration, Strukturdeklaration, das ist kein Problem! ! ! Warum muss es also in Header-Dateien und C-Dateien unterteilt werden? Und warum werden Funktionen, Variablendeklarationen, Makrodeklarationen und Strukturdeklarationen im Allgemeinen in Headern vorgenommen? Wie sieht es bei der Definition von Variablen in einer C-Datei mit der Funktionsimplementierung aus? ?

Um den Unterschied zwischen C-Dateien und Header-Dateien zu verstehen, müssen Sie zunächst den Arbeitsprozess des Compilers verstehen:

1. Lexikon- und Syntaxanalyse Phase

3. Kompilierungsphase: Kompilieren Sie sie zunächst in reine Assembleranweisungen und fügen Sie sie dann in Binärcodes zusammen, die sich auf die CPU beziehen, um jede Zieldatei zu generieren

4. In der Verbindungsphase wird die absolute Adresse jedes Codesegments in jeder Zieldatei positioniert, um eine ausführbare Datei zu generieren, die sich auf eine bestimmte Plattform bezieht. Das heißt, wenn Ihre Datei vorhanden ist Ist keine C-Datei im Projekt vorhanden, wird Ihr Projekt nicht auf Basis der Zieldatei kompiliert. Es werden eine oder mehrere Zieldateien in Funktionen und Variablen verschoben, um die endgültige ausführbare Datei auf dem PC zu generieren Das Internet hat im Allgemeinen eine Hauptfunktion, die die Konvention jedes Compilers ist. Um eine endgültige ausführbare Datei zu generieren, sind einige Zieldateien erforderlich, dh C-Dateien, und diese C-Dateien benötigen eine Hauptfunktion als Einstiegspunkt des ausführbaren Programms.

Einfach ausgedrückt ist die Kompilierung der C-Sprache in Vorverarbeitung, Kompilierung, Assemblierung und Verknüpfung unterteilt (test.c test.h => test.i => test.s => test.o => ; Test) Vier Hauptphasen. Die #include-Makroverarbeitung in der c-Datei schreibt während der Vorverarbeitungsphase den gesamten Inhalt der in c referenzierten h-Datei in die c-Datei und generiert schließlich die .i-Zwischendatei. Zu diesem Zeitpunkt ist der Inhalt der h-Datei entspricht dem Schreiben einer C-Datei.

Dies bietet auch einen Kanal für die Wiederverwendung von Code, sodass diese h-Datei in mehreren c-Dateien abgelegt und mehrfach kompiliert werden kann. Der Grund dafür ist Sie können beim Einfügen von Definitionen nur Deklarationen einfügen. Wenn das Programm verknüpft ist (mehrere int a; starke Symboldefinitionen sind im System definiert), tritt ein Fehler auf . Deklarationen stellen die Änderungen an der Definition dar, die letztendlich in einer Definition enden, sodass es beim Verknüpfen nicht zu Fehlern durch wiederholte Definitionen kommt.

Bei der Programmierung müssen wir das folgende Format in h-Dateien verwendet haben

#ifndef  XXX_H
#define  XXX_H
 //……
#endif
Nach dem Login kopieren

Haha, was nützt es? Es kann doppelte Definitionen beseitigen, wenn h-Dateien aufeinander verweisen. Natürlich spielen Makrodefinitionen in der Vorverarbeitungsphase eine Rolle, und im Nachkompilierungsprozess gibt es keinen Schatten von Makros.

A.h
int a();
  
B.h
#include "A.h"
  
C.h
#include "A.h"
  
D.h
#include "A.h"
#include "B.h"
Nach dem Login kopieren

In der obigen D.h-Datei werden zwei Deklarationen von int a(); wiederholt, was ein wenig repetitiv ist. Zu diesem Zeitpunkt ist das bedingte Kompilierungsmakro praktisch. Auf diese Weise gibt es keine wiederholten Definitionen .

Empfohlenes Tutorial: „

C#

Das obige ist der detaillierte Inhalt vonWelche Beziehung besteht zwischen H-Dateien und C-Dateien?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage