#ifndef ???
-
Hallo ihr Nachtschwärmer,
hoffe es kann mir jemand weiterhelfen
Beispiel:
was heißt es eigentlich wenn diese Zeilen am Anfang der datei 3dmath.h stehen?:
#ifndef _3DMATH_H
#define _3DMATH_H
-
Das sind Includeguards.
#ifndef MYHEADER_H // falls nicht definiert... #define MYHEADER_H //definiers halt ... /*code*/ #endif
Das dient dazu, das der Compiler sich beim Mehrfachincludieren
von Headern nicht verschluckt, sondern schon weiss, was er bereits
eingelesen hat.Devil
-
Veritas schrieb:
Hallo ihr Nachtschwärmer,
hoffe es kann mir jemand weiterhelfen
Beispiel:
was heißt es eigentlich wenn diese Zeilen am Anfang der datei 3dmath.h stehen?:
#ifndef _3DMATH_H
#define _3DMATH_HDas ist der Anfang eines Include Guards. Der ganze sieht dann so aus:
#ifndef _3DMATH_H #define _3DMATH_H <Inhalt> #endif
Oft kommt es vor, dass .h Dateien über verschiedene Ecken in die selbe Datei includiert werden. Damit die Definitionen in den .h Dateien doppelt und dreifach vorkommen und das Programm ungültig machen, setzt man diese Include Guards. Dazu wählt man ein Makro, dass als Guard dient, hier _3DMATH_H. Wenn der Header zum ersten mal includiert wird ist das Makro nicht definiert und #ifndef _3DMATH_H ist wahr, so dass der Inhalt includiert wird. Die erste Direktive dahinter ist aber das #define _3DMATH_H, die das Makro definiert. Wird die Datei nun ein zweites mal includiert, ist das Makro definiert und der gesamte Inhalt wird übersprungen.
Es ist üblich in alle .h Dateien Include Guards zu setzen. Allerdings darfst du keine Makronahmen auswählen, der mit einem _ anfängt, oder mehr als ein _ im Namen hat. Diese Namen sind für den Hersteller deiner C++ Implementierung reserviert. Wenn also die 3dmath.h nicht gerade von deinem Hersteller kommt, hat der Autor illegalen Code ausgeliefert.
-
Hier kannst du noch weiter lesen zu diesem Thema:
http://www.cpp-tutor.de/cpp/le08/le08_04.htm#ifdef
-
und is es wichtig ob das Groß oder klein geschrieben wird?
-
und is es wichtig ob das Groß oder klein geschrieben wird?
-
Veritas schrieb:
und is es wichtig ob das Groß oder klein geschrieben wird?
nein, das is völlig egal, aber es ist üblich defines komplett GROSS zu schreiben da sie ziemlich gefährlich sein können und man so das etwas entschärfen kann =).
-
Ponto schrieb:
oder mehr als ein _ im Namen hat
Nur, wenn die in Folge auftreten problematisch, oder?
Also nur MYHEADER__H ist schlecht oder auch MY_HEADER_H?
-
Cocaine schrieb:
Ponto schrieb:
oder mehr als ein _ im Namen hat
Nur, wenn die in Folge auftreten problematisch, oder?
Also nur MYHEADER__H ist schlecht oder auch MY_HEADER_H?Du hast recht. Die dürfen nicht in Folge auftreten. MY_HEADER_H ist ok. Hab mich falsch ausgedrückt.
-
Ich hab sie immer so genannt _PROJEKT_HEADERNAME_H_, aber inzwischen hab ich mich an das praktische #pragma once gewöhnt
-
SirLant, laß die Underscores vorne weg, dann paßt's.
edit
Ach ja, und #pragma once ist VC++ spezifisch, soweit ich weiß.
-
Weshalb sollt ich den Unterstrich vorne weglassen? Wenn nen Compiler wirklich genau den Namen für nen Makro verwendet wie ich, dann sollt ich mir Gedanken über den Namen machen und nicht über nen führenden Unterstrich.
-
SirLant schrieb:
Weshalb sollt ich den Unterstrich vorne weglassen? Wenn nen Compiler wirklich genau den Namen für nen Makro verwendet wie ich, dann sollt ich mir Gedanken über den Namen machen und nicht über nen führenden Unterstrich.
Man weiß nicht immer, wann man sich damit eine Falle stellt. Bei uns hatten wir letztens noch das Problem. Jemand hatte vor Jahren in C eine Liste in der Datei list.h implementiert und den Include Guard _LIST_H genannt. Nun wurde diese Datei indirekt in einem C++ Projekt verwendet, dass auch ein #include <list> hatte. Es hat lange gebraucht, bis der eigentliche Fehler gefunden wurde.
-
SirLant schrieb:
Weshalb sollt ich den Unterstrich vorne weglassen? Wenn nen Compiler wirklich genau den Namen für nen Makro verwendet wie ich, dann sollt ich mir Gedanken über den Namen machen und nicht über nen führenden Unterstrich.
Der Standard bemängelt aber führende Unterstriche mit folgendem Großbuchstaben und nicht irgendwelche Namen dahinter wie LIST, VECTOR etc.
-
Bei mir würde die dann _UTIL_LIST_H heißen und dann gäb es keine Probs
abgesehen davon verwende ich aus dem Grund auch das #pragma once