C++-Programme werden in Dateien geschrieben, lesen Sie einfach diesen Artikel

Ich höre oft, dass ein Semester in separaten Dateien geschrieben wird .

Also, was ist das?
Die Bedeutung des Schreibens in separate Dateien (modulare Programmierung) besteht darin, den Code eines Programms in mehreren Dateien zu speichern, dh verschiedene Funktionsmodule in verschiedenen Dateien zu platzieren und die erforderlichen Verbindungen zwischen diesen Modulen herzustellen. Eine Programmiermethode, die mit zusammenarbeitet einander, um die gesamte Funktion zu vervollständigen.
Fügen Sie hier eine Bildbeschreibung ein

Und welche Vorteile hat es?

1. Vorteile

1. Einfache Wartung : Das Schreiben von Programmen in separaten Dateien kann die Modulverwaltung erleichtern. Jedes Modul verfügt über relativ unabhängige Funktionen und Verantwortlichkeiten. Die Änderung eines Moduls wirkt sich nicht auf die Funktionen anderer Module aus, sodass die Wartung und Aktualisierung des Programms einfacher ist. Einfach.

2. Code-Wiederverwendung : Durch die modulare Programmierung können mehrere Programme dasselbe Modul gemeinsam nutzen, um Code-Redundanz und -Duplizierung zu reduzieren.

3. Hohe Lesbarkeit : Das Schreiben in separate Dateien kann die Lesbarkeit des Programms verbessern. Die Funktionen und Verantwortlichkeiten jedes Moduls sind klar und leicht zu verstehen.

4. Entwicklungseffizienz verbessern : Programmierer können mehrere Module gleichzeitig entwickeln, um das gesamte Programm zu implementieren, was die Entwicklungseffizienz verbessern kann.

5. Bequemes Testen : Modulare Programme können separat getestet werden, was das Erkennen und Lösen von Problemen im Programm erleichtert.

6. Programmstabilität verbessern : Modulare Programmierung kann die Möglichkeit von Programmfehlern verringern und die Programmstabilität und -zuverlässigkeit verbessern. 1. Einfache Wartung: Das Schreiben von Programmen in separaten Dateien kann die modulare Verwaltung erleichtern. Jedes Modul verfügt über relativ unabhängige Funktionen und Verantwortlichkeiten. Die Änderung eines Moduls hat keinen Einfluss auf die Funktionen anderer Module, sodass die Wartung und Aktualisierung des Programms einfacher ist. Einfach.

1. Dateityp

C++-Programme werden normalerweise in drei Dateitypen unterteilt:

Header-Datei (.h) : Enthält verschiedene Deklarationen zur Einbindung in CPP-Dateien.
Moduldatei (.cpp) : Enthält Funktionsdefinitionen, auch Funktionsmodule genannt.
Hauptprogrammdatei (.cpp) : Eine Datei mit der Funktion main(), die als Programmeintrag dient und die in der Moduldatei implementierten Methoden aufruft.

1.1.Header-Datei

Header-Dateien dienen dazu, mehrere Quelldateien zu kontaktieren, und sie sind die Schnittstelle zwischen Quelldateien. Ähnlich wie die C-Sprache erfordert C++ zuerst eine Deklaration und dann eine Verwendung, wird jedoch während der Kompilierung in einer einzigen Datei kompiliert. Hier ist ein Beispiel ohne Header-Datei:

// main.cpp
void fun();     // 必须先声明,否则会出错

int main(){
    
    
fun();       // 调用fun函数
}

// fun.cpp
#include <iostream>
void fun(){
    
    
std::cout << "This is fun." << std::endl;
}

Nachdem diese beiden Dateien mit dem Befehl „g++ main.cpp fun.cpp“ kompiliert wurden, können sie normal ausgeführt werden. Es muss verstanden werden, dass der Kompilierungsprozess von C++ darin besteht, jede Datei einzeln zu kompilieren und dann die mehreren kompilierten Dateien durch Verknüpfen zu einem ausführbaren Programm zu kombinieren. Während der Kompilierung werden nur Funktionsdeklarationen überprüft. Solange die Datei zuvor eine Funktion deklariert hat, wird sie erfolgreich kompiliert. Funktionsdefinitionen werden während der Verknüpfungsphase überprüft und die Verknüpfung umfasst mehrere Dateien. Im obigen Beispiel muss main.cpp zuerst die Funktion fun () deklarieren, bevor sie kompiliert werden kann. Obwohl die Funktion nicht in main.cpp definiert ist, wird beim Verknüpfen festgestellt, dass fun.cpp die Funktion definiert, also das Programm richtig.

Allerdings ist es mühsam und fehleranfällig, Funktionen aus anderen Dateien jedes Mal manuell zu deklarieren. Deshalb legen wir die Deklarationsanweisungen in einer Datei ab und nennen sie „Header-Datei“. Wenn Sie eine bestimmte Funktion verwenden müssen, fügen Sie die Header-Datei hinzu, in der sie sich befindet. Der Inhalt der Header-Datei wird vor der Kompilierung in die Quelldatei eingefügt, sodass er während der Kompilierung normal übergeben werden kann. Schauen wir uns als Nächstes ein Beispiel mit einer Header-Datei an:

// main.cpp
#include "header.h"

int main(){
    
    
fun();
}

// header.h
#ifndef HEADER_H
#define HEADER_H

void fun();

#endif

// fun.cpp
#include <iostream>
void fun(){
    
    
std::cout << "This is fun." << std::endl;
}

Der Inhalt von Header-Dateien ist normalerweise von vorbereiteten Anweisungen für die bedingte Kompilierung umgeben (wie im Beispiel oben), um mehrfache Einschlüsse aufgrund von Abhängigkeitsproblemen zu verhindern.

Nachdem wir nun die Rolle von Header-Dateien verstanden haben, stellt sich die Frage, welcher Inhalt in Header-Dateien platziert werden sollte. Was sollte nicht in Header-Dateien platziert werden? Es ist ganz einfach. Wenn dieser Teil in jede zugehörige CPP-Datei kopiert werden muss, fügen Sie ihn in die Header-Datei ein. Wenn das Kopieren in mehrere CPP-Dateien zu Verknüpfungsfehlern führen kann, fügen Sie ihn nicht in die Header-Datei ein. Speziell:

Funktionsdeklaration: Offensichtlich sollte sie, wie bereits erwähnt, in der Header-Datei platziert werden.
Klassendefinition, Strukturdefinition: Stellen Sie sich die Logik der Funktionsdefinition vor. Es scheint, dass sie nicht in der Header-Datei platziert werden kann. Aber es sollte eigentlich in der Header-Datei platziert werden. Zunächst sollte jede CPP-Datei eine Definition haben, damit der Compiler weiß, wie er dem Objekt Speicherplatz zuweist. Zweitens weisen Typdefinitionen keinen Speicherplatz zu.
Vorlagenfunktion: Der Compiler muss die entsprechende Funktion zur Kompilierungszeit basierend auf der Funktionsvorlage instanziieren, daher sollte sie in der Header-Datei platziert werden.
Inline-Funktionen: Der aufrufende Speicherort wird zur Kompilierungszeit eingefügt und sollte daher auch in der Header-Datei platziert werden.
Funktionsdefinition: Nein! C++ legt fest, dass eine Funktion mit derselben Signatur in einem Programm nur eine Definition haben kann. Wenn die Funktionsdefinition in einer Header-Datei platziert wird und mehrere CPP-Dateien die Header-Datei enthalten, werden beim Verknüpfen mehrere Definitionsversionen angezeigt, was zu Verknüpfungsfehlern führt.
Variablendefinition: Nein! Ähnlich wie in der obigen Situation besteht beim Einfügen in mehrere Dateien das Problem, dass dieselbe Variable mehrmals definiert wird, was zu Verknüpfungsfehlern führt. Allerdings können statische Variablen und externe Variablen sowie makrodefinierte Konstanten in mehreren Dateien vorkommen, da diese keine Verknüpfungsfehler verursachen.

1.2. CPP-Quelldatei

Nach dem Extrahieren des Inhalts der Header-Datei kann der verbleibende Inhalt in die CPP-Datei eingefügt werden. In der CPP-Datei gibt es keine Änderung, außer dass die entsprechende Header-Datei eingebunden werden muss.

Obwohl es sich bei allen um CPP-Dateien handelt, müssen sie dennoch als Moduldateien und Hauptprogrammdateien behandelt werden. In der tatsächlichen Entwicklung werden die Funktionsanbieter und Benutzer von Moduldateien und Hauptprogrammdateien normalerweise von verschiedenen Personen entwickelt.

2. Kompilierung mehrerer Dateien

Wenn Sie die integrierte Entwicklungsumgebung unter Windows verwenden, müssen Sie nur auf die Schaltfläche „Erstellen“ klicken und dies ist mit einem Klick erledigt. Möglicherweise haben Sie jedoch ein mangelndes Verständnis für diesen Vorgang. Am Beispiel von Linux stellen wir daher den einfachsten Befehl zum Kompilieren mehrerer Dateien vor:

g++ main.cpp fun.cpp -o out # 列举所有要编译的文件

Sie können es auch zunächst separat in eine .o-Datei kompilieren und dann verknüpfen:

g++ -c main.cpp -o main.o
g++ -c fun.cpp -o fun.o
g++ main.o fun.o -o out

Der zweite Ansatz kann Verwirrung stiften – warum so viel Ärger? Dieser Ansatz bietet jedoch einen Vorteil: Aktualisierungen der Modulkompilierung. Es müssen nur die geänderten Dateien kompiliert und mit anderen Dateien verknüpft werden, ohne dass das gesamte Projekt neu kompiliert werden muss.

In einem tatsächlichen Projekt kann die Anzahl der Projektdateien sehr groß sein. Unabhängig von der verwendeten Methode müssen die Dateien einzeln aufgelistet werden, was nicht praktikabel ist. Integrierte Entwicklungsumgebungstools haben dieses Problem natürlich nicht. Unter Linux können Sie Makefile aber auch zur Projektverwaltung und automatischen Kompilierung verwenden. Natürlich ist dies ein weiterer Aspekt, den es zu lernen gilt.

Supongo que te gusta

Origin blog.csdn.net/aliyonghang/article/details/132548330
Recomendado
Clasificación