Heim > Backend-Entwicklung > C++ > Warum sollten Sie es vermeiden, .cpp-Dateien anstelle von .h-Dateien einzuschließen?

Warum sollten Sie es vermeiden, .cpp-Dateien anstelle von .h-Dateien einzuschließen?

Barbara Streisand
Freigeben: 2024-11-27 19:20:11
Original
932 Leute haben es durchsucht

Why Should You Avoid Including .cpp Files Instead of .h Files?

Einschließen von .cpp-Dateien: Führt es zu Duplikaten?

In einem Programmierkontext sind Header-Dateien (.h) und Quelldateien (. cpp) spielen eine entscheidende Rolle. Header-Dateien enthalten Funktions- und Klassendeklarationen, die es anderen Modulen ermöglichen, mit ihnen zu interagieren. Obwohl allgemein empfohlen wird, Header-Dateien einzuschließen, stellt sich die Frage: Können Sie stattdessen Quelldateien (.cpp) direkt einbinden?

Die Antwort ist ein klares „Nein“. Das Einschließen von CPP-Dateien kann zu mehreren Definitionsfehlern führen. Um zu verstehen, warum, schauen wir uns den folgenden Code an:

// main.cpp
#include <iostream>
#include "foop.h"

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
Nach dem Login kopieren
// foop.h
#ifndef FOOP_H
#define FOOP_H
int foo(int a);
#endif
Nach dem Login kopieren
// foop.cpp
int foo(int a) {
  return ++a;
}
Nach dem Login kopieren

Mit der enthaltenen Header-Datei lässt sich der Code ohne Probleme kompilieren und ausführen. Nehmen wir jedoch an, wir fügen fälschlicherweise die Quelldatei (.cpp) anstelle der Header-Datei ein:

// main.cpp
#include <iostream>
#include "foop.cpp"

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
Nach dem Login kopieren

In diesem Szenario gibt der Compiler einen Fehler aus:

multiple definition of foo(int)
first defined here
Nach dem Login kopieren

Was ist die Ursache? dieser Fehler? Wenn der Präprozessor eine Quelldatei (.cpp) einschließt, kopiert er den gesamten Inhalt dieser Datei in die aktuelle Datei. Im Wesentlichen würde also der folgende Code generiert werden:

// main.cpp
#include <iostream>

int foo(int a) {
  return ++a;
}

int main() {
  int x = 42;
  std::cout << x << std::endl;
  std::cout << foo(x) << std::endl;
  return 0;
}
Nach dem Login kopieren

Wie Sie sehen können, ist die Funktion foo() jetzt zweimal in derselben Datei definiert, was zu einem Fehler bei mehreren Definitionen führt. Um dieses Problem zu vermeiden, ist es wichtig, Header-Dateien (.h) anstelle von Quelldateien (.cpp) einzuschließen. Header-Dateien deklarieren Funktionen und Klassen ohne ihre Implementierungen, um Duplikate zu verhindern und sicherzustellen, dass im gesamten Programm nur eine Definition jeder Funktion vorhanden ist.

Das obige ist der detaillierte Inhalt vonWarum sollten Sie es vermeiden, .cpp-Dateien anstelle von .h-Dateien einzuschließen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage