Include Guards
Teil des Abschnitts Objektorientierte Programmierung der C-Journey von Coddy. Lektion 2 von 61.
Wenn eine Headerdatei in einem Projekt mehrfach eingebunden wird, sieht der Compiler dieselben Deklarationen wiederholt, was zu Fehlern führt. Das passiert 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äprozessordirektiven, um sicherzustellen, dass der Inhalt einer Headerdatei 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. Wenn das nicht der Fall ist, 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 Einbinden dieser Header-Datei ist MATH_UTILS_H bereits definiert, daher wird der gesamte Block übersprungen. Der Name der Include-Guard-Konstante entspricht typischerweise dem Dateinamen in Großbuchstaben, wobei Punkte und Sonderzeichen durch Unterstriche ersetzt werden.
Jede Header-Datei, die du erstellst, sollte Include-Guards haben. Das ist eine gängige Praxis, die Kompilierungsfehler verhindert und dafür sorgt, dass dein Code überall in deinem Projekt sicher eingebunden werden kann.
Aufgabe
EinfachLass uns eine Header-Datei vor mehrfacher Einbindung schützen, indem wir Include-Guards hinzufügen. Du baust auf dem Begrüßungsprogramm aus der vorherigen Lektion auf, stellst diesmal aber sicher, dass die Header-Datei mehrfach sicher 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 und verwendest dafür das SymbolGREET_H.main.c: Deine Hauptdatei, die den Header einbindet, die Funktiongreetimplementiert und sie vonmain()aus aufruft.
Die Funktion greet soll einen Parameter vom Typ const char* für den Namen entgegennehmen 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 im obigen Format gezeigt aus und ersetze dabei Alice durch den angegebenen Namen.
Probier es selbst
#include <stdio.h>
#include "greet.h"
// TODO: Implementiere die Funktion greet, die "Hello, <name>!" ausgibt
int main() {
char name[100];
scanf("%s", name);
// TODO: Rufe die Funktion greet mit dem Namen 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