Include Guards
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 2 von 61.
Wenn eine Header-Datei mehrmals in ein Projekt eingebunden wird, sieht der Compiler dieselben Deklarationen wiederholt, was zu Fehlern führt. Dies geschieht häufig, wenn mehrere Dateien denselben Header einbinden oder wenn Header sich gegenseitig einbinden. Include-Guards lösen dieses Problem.
Eine Include-Guard verwendet drei Präprozessor-Direktiven, um sicherzustellen, dass der Inhalt eines Header-Files nur einmal verarbeitet wird:
// math_utils.h
#ifndef MATH_UTILS_H
#define MATH_UTILS_H
int add(int a, int b);
#endif
So funktioniert es: #ifndef MATH_UTILS_H prüft, ob das Symbol MATH_UTILS_H noch nicht definiert wurde. Falls nicht, fährt der Präprozessor fort und definiert es sofort mit #define MATH_UTILS_H. Alles zwischen diesem Punkt und #endif wird in die Kompilierung einbezogen.
Beim zweiten Mal, wenn dieser Header eingebunden wird, ist MATH_UTILS_H bereits definiert, sodass der gesamte Block übersprungen wird. Der Name des Guards ist normalerweise der Dateiname in Großbuchstaben, wobei Punkte und Sonderzeichen durch Unterstriche ersetzt werden.
Jede Header-Datei, die du erstellst, sollte Include-Guards enthalten. Dies ist eine gängige Praxis, die Kompilierungsfehler verhindert und es sicher macht, deinen Code von überall in deinem Projekt einzubinden.
Aufgabe
EinfachSchützen wir eine Header-Datei vor doppeltem Einbinden, indem wir Include-Guards hinzufügen. Du baust auf dem Begrüßungsprogramm aus der vorherigen Lektion auf, stellst diesmal jedoch sicher, dass der Header problemlos mehrfach eingebunden werden kann.
Du erstellst zwei Dateien:
greet.h: Deine Header-Datei mit der Funktionsdeklaration fürgreet. Diesmal umschließt du den gesamten Inhalt mit Include-Guards unter Verwendung des SymbolsGREET_H.main.c: Deine Hauptdatei, die den Header einbindet, die Funktiongreetimplementiert und sie vonmain()aus aufruft.
Die Funktion greet soll einen const char*-Parameter für den Namen akzeptieren und Folgendes ausgeben:
Hello, Alice!Deine Header-Datei sollte dieser Struktur folgen:
#ifndef GREET_H
#define GREET_H
// function declaration here
#endifDu erhältst eine Eingabe: einen Namen (String).
Gib die Begrüßungsnachricht genau wie oben im angegebenen Format aus und ersetze Alice durch den angegebenen Namen.
Probier es selbst
#include <stdio.h>
#include "greet.h"
// TODO: Implementiere die greet-Funktion, die "Hello, <name>!" ausgibt
int main() {
char name[100];
scanf("%s", name);
// TODO: Rufe die greet-Funktion mit name auf
return 0;
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Grundlagen der modularen Programmierung
Header-DateienInclude GuardsQuelldateienStatische FunktionenWiederholung: Modularer Taschenrechner4Kapselung
Konzept der Opaque PointersOpaque Structs definierenGetter und SetterValidierung in SetternRückblick: Die geheime Box2Objekte und Methoden
Structs als ObjekteDer 'Self'-PointerConst-CorrectnessPointer vs. WertHilfsmethodenZusammenfassung: Point Manager5Projekt: Einfaches Bankkonto
Projekt-SetupImplementierung des Kontos3Objekt-Lebenszyklus
Konstruktor-MusterDestruktor-MusterStack-InitialisierungTiefe KopieRückblick: String-Wrapper6Vererbung durch Komposition
Struct-EinbettungDie First-Member-RegelZugriff auf Parent-MemberUpcastingRückblick: Formenhierarchie9Projekt: Formen-Zeichner
ProjektübersichtKreis-ImplementierungRechteck-ImplementierungPolymorphe VerwendungShape-ContainerÜbe selbstständig: Online-C-Compiler