Forum: Compiler & IDEs Wozu #define __HeaderDatei__?


von Mathias M. (0undnichtig)


Lesenswert?

Moin,

öfters sehe ich, das in Bibliotheken zum Anfang ein #define 
_NameDerDatei_ gemacht wird, kann mir jemand erläutern, wozu?
Ist dass dazu da, dass andere Libs darauf reagieren können, z.B. je nach 
unterschiedlicher I²C Lib andere Befehle nutzen?

von Karl heinz B. (kbucheg)


Lesenswert?

> Ist dass dazu da, dass andere Libs darauf reagieren können, z.B. je nach
> unterschiedlicher I²C Lib andere Befehle nutzen?

Wäre eine Möglichkeit.

Oft sind das aber nur sog. Include Guards:
Die Header-Darei beginnt in diesem Fall so:

#ifndef NameDerDatei
#define NameDerDatei

// hier kommt dann der Inhalt des Files

#endif

Sinn der Sache, ist es, dass diese Header-Datei beim Compilieren
von 1 c-File nur ein einziges mal durch den Compiler gejagt
wird. Selbst dann, wenn das Header-File über Umwege indirekt
mehrmals includet wird.


von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Hier gilt es übrigens auch, folgendes zu beachten: Führende Unterstriche 
sind in der Namensgebung für Anwender verboten. Dieses Privileg wurde 
nur den Entwicklern der C-Libs und den Compilerbauern zugesagt.

von Bjoern B. (tishima)


Lesenswert?

Danke, Patrick....

Ich haette sonst weiter als rechtschaffenner Bürger verbotene Dinge 
getan. :-)

gruß,
Bjoern

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Tjo, lesen Bildet ;-)

Ist aber schon ein alter Hut: 
Beitrag "Re: Präprozessor Konventionen"

von Peter D. (peda)


Lesenswert?

Bjoern Buettner wrote:

> Ich haette sonst weiter als rechtschaffenner Bürger verbotene Dinge
> getan. :-)


Nö, so schlimm ist es nicht.

"Verboten" ist stark übertrieben, man sollte höchstens "unschön" sagen.

Der Compiler kann ja nicht unterscheiden, ob der Unterstrich in nem 
Library-Header oder in Deinem eigenen C-Code auftaucht.
Für ihn ist er daher immer ein zulässiges Zeichen.


Peter

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> "Verboten" ist stark übertrieben, ...

Nein, ist es nicht.  Diese Konvention gilt, damit Compiler und
Bibliothek ("The implementation" im Sinne des C-Standards) eine
Möglichkeit haben, Bezeichner für ihre internen Zwecke zu benutzen,
die auf keinen Fall mit der Applikatoin kollidieren.  Daher die
Trennung in `implementation name space' und `application name
space'.

Selbstverständlich, so lange niemand anders deinen Bezeichner benutzt,
passiert dabei nichts.  Aber das kann sich natürlich bereits mit der
nächsten Version der Bibliothek ändern.

von Mathias M. (0undnichtig)


Lesenswert?

Aha, besten Dank für die Erläuterungen!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.