Forum: Compiler & IDEs Was bedeuten vorgestellte "underline"?


von Bitzer (Gast)


Lesenswert?

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?

:
von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Zu doof zum googlen (Gast)


Lesenswert?

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 :-)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Zu doof zum googlen schrieb:
> Was könnte das für eine Dokumentation sein?

In vielen Unix-/Linux-Dokumentationen zur C-Lib finden sich solche 
Bezeichner.

Ganz einfaches Beispiel: 
http://man7.org/linux/man-pages/man2/open.2.html

_POSIX_C_SOURCE, _XOPEN_SOURCE, _GNU_SOURCE

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Schamane (Gast)


Lesenswert?

_TIME__ __DATE_ sind auch so interne Macros mit denen du z.B. die 
Buildtime in dein Programm einbauen kannst.

von A. S. (Gast)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

Beitrag #5880831 wurde von einem Moderator gelöscht.
von leo (Gast)


Lesenswert?

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

von leo (Gast)


Lesenswert?

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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch Moderator
Beitrag #5880953 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Lesenswert?

Ü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. ;-)

: Bearbeitet durch User
von Bauform B. (bauformb)


Lesenswert?

strand ist z.B. nur reserviert wenn du Kurtaxe bezahlt und einen 
strandkorb gemietet hast :)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

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.