Liebes Forum, ich bin öfters schon in irgendwelchen C Programmen über
Namen gestolpert, die ein oder zwei underline (_) vorangestellt hatten.
Ich bin mir sicher, jeder andere weiß warum, was es bedeutet. Ich muss
da wohl wieder mal mit offenen Augen geschlafen haben... Könnt ihr mir
mal auf die Sprünge helfen?
Bezeichner, die mit einem Unterstrich beginnen, der von einem weiteren
Unterstrich oder einem Großbuchstaben gefolgt wird, sind für "die
Implementierung" (also Compiler + Standardbibliothek) reserviert. Solche
Bezeichner darfst du folglich nicht selbst erfinden und verwenden nur
dann, wenn dich irgendeine Dokumentation dazu ermächtigt, es genau so zu
tun.
Bezeichner, die mit einem Unterstrich beginnen, der von einem
Kleinbuchstaben gefolgt wird, benutzen manche Leute gern intern für
besondere Zwecke, aber eine einheitliche Regel dafür gibt es nicht.
Jörg W. schrieb:> Solche Bezeichner darfst du folglich nicht selbst erfinden und verwenden> nur dann, wenn dich irgendeine Dokumentation dazu ermächtigt, es genau> so zu tun.
Was könnte das für eine Dokumentation sein?
Vielen Dank für die schnelle Antwort :-)
Frank M. schrieb:>> Was könnte das für eine Dokumentation sein?>> In vielen Unix-/Linux-Dokumentationen zur C-Lib finden sich solche> Bezeichner.
Oder bspw. in der avr-libc wirst du ermutigt, Bitmasken mit dem Makro
_BV() zu erzeugen, oder bei Verwendung von <util/delay.h> ggf. einen
Makro wie __DELAY_ROUND_CLOSEST__ zu setzen, falls du statt der
standardmäßigen Aufrundung der ermittelten Werte eine Auf- oder
Abrundung auf den nächstgelegenen Wert haben möchtest.
Auch ein Compiler kann dir in seiner Doku derartige Bezeichner
nahelegen, so kann man beim GCC mittels __extension__ kennzeichnen, dass
das nachfolgende, GCC-spezifische Konstrukt auch in einem der strikten
Standard-Modi (-std=c99 etc.) ohne Warnung akzeptiert werden soll.
Aber grundsätzlich: der unterstrich ist neben den 2x26 Buchstaben das
53te erlaubte Zeichen für Bezeichner. Und ab dem zweiten Zeichen auch
die 10 Ziffern.
Die Reservierung ist eher Konvention. wenn Du eine Funktion _Q nennst,
wirst Du vermutlich kein Problem bekommen.
A. S. schrieb:> Die Reservierung ist eher Konvention.
Nein!
Sie ist Vorschrift, das steht so im Standard. (7.1.3, Absatz 2, wenn
du es nicht glaubst.)
> wenn Du eine Funktion _Q nennst,> wirst Du vermutlich kein Problem bekommen.
Vermutlich, vermutlich nicht, wie auch immer. Es kann dir damit der
Compiler um die Ohren fliegen, die Festplatte gelöscht werden, ein
heilloses Durcheinander in deinem Compilat entstehen – oder vielleicht
auch nichts davon. Das ist nicht vorhersagbar, es kann heute anders als
morgen sein, und bei deinem Nachbarn anders als bei dir.
Eben die gesamte Palette dessen, was als "undefined behaviour"
bezeichnet wird.
Jörg W. schrieb:> Eben die gesamte Palette dessen, was als "undefined behaviour"> bezeichnet wird.
Von "undefined behaviour" ist dort nicht die Rede. Bei einer Kollision
mit dem reservierten Identifier wird dein Programm wahrscheinlich nicht
mehr kompilieren und fertig.
leo
leo schrieb:> Jörg W. schrieb:>> Eben die gesamte Palette dessen, was als "undefined behaviour">> bezeichnet wird.>> Von "undefined behaviour" ist dort nicht die Rede.
Sorry, ich behaupte das Gegenteil ;-)
> Bei einer Kollision> mit dem reservierten Identifier wird dein Programm wahrscheinlich nicht> mehr kompilieren und fertig.
... bleibe aber dabei.
leo
leo schrieb:> Von "undefined behaviour" ist dort nicht die Rede.
Dann musst du ein anderes Dokument lesen als ich.
1
If the program declares or defines an identifier in a
2
context in which it is reserved (other than as allowed by 7.1.4),
3
or defines a reserved identifier as a macro name, the behavior is
4
undefined.
Edit: OK, du hast es wohl auch gefunden.
Natürlich ist es sehr wahrscheinlich, dass es simpel bei einem
Compilerfehler bleibt, aber da gerade Makros alles Mögliche veranstalten
können, kann eben auch alles Mögliche als Ergebnis entstehen.
Daher lässt man tunlichst die Finger davon, eine Funktion _Q oder
dergleichen selbst zu definieren.
Übrigens gibt's noch ein paar weitere reservierte Namen (wenn auch
eingeschränkt, da abhängig von Header-Includes) wie z.b. today, strand,
istwert, E10 oder INTERNET. ;-)
A. S. schrieb:> Die Reservierung ist eher Konvention. wenn Du eine Funktion _Q nennst,> wirst Du vermutlich kein Problem bekommen.
Dann hoffe ich mal, dass du keine Dinkumware (kommerzielle Standard
C-Bibliothek) einsetzt. Da gibt's in den Headers so tolle Makros wie _X,
__X (oder war's _XX?), _Y etc.
Ob _Q nicht dabei ist, kann ich jetzt nicht versprechen.