Forum: Compiler & IDEs Präprozessor Konventionen


von Volker Endres (Gast)


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

von Wiesi (Gast)


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

von Christoph _. (chris)


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.

von Christoph _. (chris)


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.

von Volker Endres (Gast)


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

von Christoph _. (chris)


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.

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.