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 :-)
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
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.
_TIME__ __DATE_ sind auch so interne Macros mit denen du z.B. die Buildtime in dein Programm einbauen kannst.
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.
Beitrag #5880831 wurde von einem Moderator gelöscht.
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.
:
Bearbeitet durch Moderator
Beitrag #5880953 wurde von einem Moderator gelöscht.
Ü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
strand ist z.B. nur reserviert wenn du Kurtaxe bezahlt und einen strandkorb gemietet hast :)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.