mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Bitzer (Gast)
Datum:

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

:
Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Zu doof zum googlen (Gast)
Datum:

Bewertung
-2 lesenswert
nicht 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 :-)

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

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

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

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

Autor: Schamane (Gast)
Datum:

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

Autor: A. S. (achs)
Datum:

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

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.
Autor: leo (Gast)
Datum:

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

Autor: leo (Gast)
Datum:

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

Autor: Jörg W. (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
leo schrieb:

> Von "undefined behaviour" ist dort nicht die Rede.

Dann musst du ein anderes Dokument lesen als ich.
If the program declares or defines an identifier in a
context in which it is reserved (other than as allowed by 7.1.4),
or defines a reserved identifier as a macro name, the behavior is
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.
Autor: Rolf M. (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Bauform B. (bauformb)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Dieser Beitrag kann nur von angemeldeten Benutzern beantwortet werden. 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, Yahoo oder Facebook? Keine Anmeldung erforderlich!
Mit Google-Account einloggen | Mit Facebook-Account einloggen
Noch kein Account? Hier anmelden.