Präprozessor Konventionen

Gast #283407
Lesenswert?

Hallo an Alle,
habe mal eine ganz allgemeine Frage zur Festlegung von Symbolen für
Präprozessoranweisungen.
Wie sind eigentlich die Festlegungen der "_" in Worten Unterstrichen
wie  z.B. #ifndef AVR_IOM32_H_ oder __TIME_ zu verstehen.

Danke für Antworten und Gruß Volker
Gast #283408
Lesenswert?

Also so weit ich weiß, werden Konstanten, die nur innherhalb von
Include Dateien von Bedeutung sind, mit einem '_' (underscore)
begonnen, um die Wahrscheinlichkeit, dass es einen Namenkonflikt mit
vom Benutzer(programm) definierten Konstanten gibt, reduziert wird.

Konstanten die mit 2 underscores "__" beginnen, sind meines Wissens
oft System- bzw. Bibiotheksabhängige Konstanten.

  Wiesi
#283409
Lesenswert?

Führende Unterstriche sind in normalem "User-Code" verboten. Da die
(avr-)libc-Entwickler für ihre Bezeichner aber führende Unterstriche
nehmen dürfen, verhindert diese Konvention möglicherweise auftretende
Kollisionen. Genau genommen ist es übrigens keine Konvention, sondern
vom C-Standard so vorgeschrieben. Code, der führende Unterstriche bei
Präprozessorsymbolen verwendet und nicht zu einer Compilerbibliothek
wie der libc gehört, ist (soweit ich weiß) kein "well-formed C code".
Ein Standard-C-Compiler darf sich also zu Recht weigern, so etwas zu
übersetzen.

Unterstriche an allen anderen Positionen (am Ende oder mittendrin) darf
man immer verwenden; dann hängt es wirklich nur von einer Konvention ab,
ob man nun "TIME_" oder "TIME" schreibt.
#283410
Lesenswert?

Mein Beitrag bezog sich auf führende Unterstriche in
Präprozessorsymbolen. Die sind meines Wissens nach immer verboten, egal
ob man einen oder zwei Unterstriche voran stellt.

Nur bei anderen Bezeichnern gibt es hier einen Unterschied: Lokale
Symbole (lokal im Sinne von "lokal in einer Funktion/Codeblock",
nicht "lokal für eine Datei") dürfen mit einem einzigen Unterstrich
beginnen. Alle nicht-lokalen Symbole dürfen aber niemals mit
Unterstrich beginnen, auch wenn es nur einer ist. Zwei führende
Unterstriche sind grundsätzlich verboten.
Gast #283411
Lesenswert?

Danke für die Antworten!
@Chris: Hast du vielleicht einen Link oder Lit.-Hinweis über diese
Dinge  für mich.

Für mich bedeutet das also wenn ich ein eigenes Headerfile schreibe,
dass ich mein Sysmbol zur Verhinderung der Mehrfacheinbindung nicht mit
_ beginnen darf?

Gruß Volker
#283412
Lesenswert?

> Hast du vielleicht einen Link oder Lit.-Hinweis über diese
> Dinge  für mich.

Ich bin mir leider gerade nicht ganz sicher, ob der C-Standard in
diesem Punkt das gleiche sagt wie der C++-Standard. Im C++-Standard
steht, dass grundsätzlich zwei führende Unterstriche verboten sind, und
außerdem ein führender Unterstrich, falls ein Großbuchstabe folgt. "Im
globalen Namensraum" dürfen keine Bezeichner mit einem führendem
Unterstrich verwendet werden. Das kann man unter [17.4.3.1.2] im
C++-Standard nachlesen, dessen "final draft" es z.B. unter
http://www.kuzbass.ru:8086/docs/isocpp/lib-intro.html#lib.global.names
gibt; der final draft ist nicht die endgültige, offizielle Version des
Standards, stimmt aber zum größten Teil mit ihr überein.

> Für mich bedeutet das also wenn ich ein eigenes Headerfile schreibe,
> dass ich mein Sysmbol zur Verhinderung der Mehrfacheinbindung nicht
mit
> _ beginnen darf?

Genau.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren