www.mikrocontroller.net

Forum: Compiler & IDEs Präprozessor Konventionen


Autor: Volker Endres (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Wiesi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker Endres (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Christoph __ (chris)
Datum:

Bewertung
0 lesenswert
nicht 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.h...
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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.