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
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
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.
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.
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
> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.