C++
VeröffentlichtRevision 1

Header, #include und mehrere Quelldateien

Eine Schnittstelle beschreibt, wie ein Programmteil benutzt wird. Die Implementierung ist der Code, der die Aufgabe tatsächlich erledigt. Ein Header stellt oft Deklarationen der Schnittstelle bereit; eine .cpp-Datei enthält die Definitionen.

Header, #include und mehrere Quelldateien#

Funktionen und Programmaufbau · Lektion 25 von 60

Voraussetzungen: Funktionen, Scope, Compiler. Lernziel: Du trennst Schnittstelle und Implementierung.

Eine Schnittstelle beschreibt, wie ein Programmteil benutzt wird. Die Implementierung ist der Code, der die Aufgabe tatsächlich erledigt. Ein Header stellt oft Deklarationen der Schnittstelle bereit; eine .cpp-Datei enthält die Definitionen.

Dieses Beispiel besteht aus drei getrennten Dateien. Kopiere jeden Codeblock in die angegebene Datei.

C++
1#ifndef BK_RECHNEN_HPP2#define BK_RECHNEN_HPP3 4double addieren(double links, double rechts);5 6#endif
C++
1#include "rechnen.hpp"2 3double addieren(double links, double rechts) {4    return links + rechts;5}
C++
1#include <iostream>2#include "rechnen.hpp"3 4int main() {5    std::cout << addieren(2.0, 3.0) << '\n';6}

Mit GCC oder Clang übersetzt du beide Quelldateien gemeinsam:

Nur Text
1g++ -std=c++17 -Wall -Wextra -Wpedantic main.cpp rechnen.cpp -o programm

Was include wirklich macht#

#include veranlasst die Einbeziehung eines Headers in die vorbereitete Quelldatei. Es ist kein Laufzeitdownload und nicht dasselbe wie das neuere C++-Schlüsselwort import. Üblich sind <...> für Standard- und konfigurierte Bibliotheksheader sowie "..." für eigene Header. Die genaue Suchreihenfolge hängt von der Werkzeugkette und ihren Suchpfaden ab.

Eine Übersetzungseinheit ist vereinfacht eine .cpp-Datei nach der Präprozessierung, einschließlich ihrer eingebundenen Inhalte. Ein Header sollte alle Header direkt einbinden, die seine eigene Schnittstelle benötigt. Verlasse dich nicht auf zufällige indirekte Einbindungen.

Include Guards#

#ifndef, #define und #endif bilden einen Include Guard. Er verhindert, dass der Headerinhalt innerhalb derselben Übersetzungseinheit mehrfach verarbeitet wird. Das benannte Makro ist hier nur eine Markierung des Präprozessors. #pragma once ist eine verbreitete Alternative mit Werkzeugunterstützung; Include Guards sind der portable Ausgangspunkt.

Typische Buildfehler#

undefined reference oder LNK2019 entsteht etwa, wenn rechnen.cpp nicht mitgebaut wird. multiple definition oder LNK2005 kann entstehen, wenn eine gewöhnliche Funktionsdefinition im Header in mehreren Übersetzungseinheiten landet. Die One Definition Rule, kurz ODR, legt fest, welche Definitionen ein Programm haben darf. Templates und geeignete inline-Definitionen haben besondere Regeln.

Übung#

Warum ist #include "rechnen.cpp" keine gute Reparatur für die vergessene Quelldatei?

Lösung

Du bindest Implementierungstext ein und riskierst doppelte Definitionen, sobald die Datei zusätzlich regulär gebaut wird. Nimm rechnen.cpp in den Build auf und binde den Header ein.

Weiterlernen#

Zurück: Gültigkeitsbereiche und Namensräume · Kursübersicht · Weiter: Rekursion und einfache Abbruchfälle

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.