[C++] Präprozessor direktive #ifndef

Code:
#ifndef __CLOGFILE
#define __CLOGFILE

Quellcode ...

#endif

Das sehe ich immer häufier in Quelltexten das bedeutet ja soviel wie wenn __CLOGFILE nocht nicht definier ist, definiere es.
Aber wozu brauche ich das ?
Was ist der Sinn davon ?

Die Texte die Google ausgespuckt hat haben mir leider nie den Zweck vermittelt.

MfG
 
Es dient als Schutzmaßnahme gegen Mehrfachincludes.
Es wird meistens bei Header-Dateien angewendet.

Und meiner bescheidenen Ansicht nach hat Google sehr einleuchtende Inhalte
präsentiert, beispielsweise diesen.
Es ist auch nicht so, dass man besondere Englischkenntnisse bräuchte, um das zu verstehen. :rolleyes:
 
na gut ok aber jetzt frage ich mich immer noch wie man das nach der #ifndef anweisung benennt ?
muss das der gleiche name sein wie die header datei heisst und wieso die "__" ?
 
Mit #define definierst du eine Konstante und afaik ist das "___" um sie in der Form eindeutig von anderen Variablen/Konstanten abzugrenzen um Konflikte zu vermeiden. Ansonsten kannst du einen beliebigen Namen wählen. Die Form der Header-Datei ist dann:

Code:
#ifndef ___HABO
#define ___HABO
#include <[...].h>
#typedef [...]
int eine_funkion(int,int)
void eine_prozedur(char*)
#endif
 
Ein Grund dürfte die bereits angesprochene mehrfache Includierung sein. Weiterhin kann man mit diesen Direktiven Code für mehrere Betriebsysteme portabel machen.

z.B.
Code:
#ifdef linux
#include <sys/socket.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif

Für Soketverbindungen.
 
In C++ darfst Du Deklarationen, die nur etwas ankündigen, beliebig oft wiederholen, alles andere dagegen nicht.

In Header-Dateien ist es unter anderem üblich, Struktur- alias Klassen-Definitionen als Schnittstellen zu definieren, darüber hinaus Konstanten.

All solches Zeug darf dem Compiler nur ein einziges Mal unter die Nase kommen.

Sobald Du das erste Mal selbst "richtig" Ausklammerungstechniken zur Vermeidung von Redundanzen anwendest (sprich: Bibliotheken für wiederverwendbaren Code schreibst), wirst Du merken, daß Du nicht Dinge nur aus einem konkreten Anwendungsprogramm in Bibliotheken verlagerst, sondern auch innerhalb Deiner Bibliotheken Dinge in verschiedene Ebenen auslagerst. Wobei viele relativ kleine und verzweigt ABHÄNGIGE Module entstehen.

Das führt dann dazu, daß eine CPP-Datei auf erste Sicht eine Handvoll Include-Dateien benötigt, jede davon aber wiederum eine Handvoll weiterer Include-Dateien, die wiederum auch noch weitere und so weiter - bis die auf der ganz untersten Ebene Deiner Bibliotheks-Hierarchie aufgelöst werden. DABEI wird es eher extrem SELTEN vorkommen, daß Deine Bibliotheksdateien auf den unteren Ebenen NICHT zig- oder gar hunderte Male für eine einzige CPP-Compilation included werden sollen. Es aber wegen den oben genannten Besonderheiten der C++-Syntax eben nur EINMAL dürfen.

Um Dir die Erstellung von solch tief strukturierten Bibliotheken zu ermöglichen, ohne daß Du einen Kollaps erleidest, andererseits aber auch den Compiler zufriedenzustellen, gibt es die Möglichkeit, Mehrfach-Includes auf Präprozessor-Ebene auszuschließen.

Das Prinzip ist ganz einfach: Du definierst irgendeine markante MARKE, die eine include-Datei eindeutig kennzeichnet, und definierst mittels "ifndef" folgendes:

Falls noch NICHT diese Marke definiert wurde (was bedeutet, daß diese include-Datei noch NICHT abgearbeitet wurde), läßt Du diese Datei abarbeiten - UND dabei AUCH jene markante Marke definieren.

Am sinnvollsten ist es zur Vermeidung von Namenskollisionen übrigens NICHT, diese Marke mit zwei, drei oder noch mehr Unterstrichen zu versehen, sondern sie mindestens nach dem Dateinamen in Zusammensetzung mit dem Namen der zugehörigen Bibliothek zu versehen. In etwa analog dem, was man in Java als Packages aufgezwungen kriegt, in C++ aber ohne weiteres auch freiwillig und mit maximaler Freiheit befolgen kann.
 
Zurück
Oben