Forum: PC-Programmierung Fragen zu Preprozessor(Token-Pasting Operator, Unterstriche)


von Max K. (laternenjoe)


Lesenswert?

Hallo,

Ich habe mir C weitesgehend selbst beigebracht, habe aber noch Fragen zu 
Preprozessoranweisungen und zwar,

wozu genau ist der Token-Pasting Operator gut?
Wann werden (doppelte) Unterstriche vor Preprozessorvariablen benutzt?
Ansonsten komm ich soweit gut klar, aber die beiden Sachen versteh ich 
irgendwie nicht. Kann mir da vllt. jemand gute Links zu Erklärungen 
geben?

von Max K. (laternenjoe)


Lesenswert?

Hier ein Kollege hat nebenan im Thread von define folgendes geschrieben:

"Der Token-Pasting-Operator fügt die ihm übergebenen Tokens zu einem
einzigen zusammen."

Aber wozu ist das gut oder wann gebraucht man soetwas?

von (prx) A. K. (prx)


Lesenswert?

Max K. schrieb:
> wozu genau ist der Token-Pasting Operator gut?

https://gcc.gnu.org/onlinedocs/cpp/Concatenation.html

> Wann werden (doppelte) Unterstriche vor Preprozessorvariablen benutzt?
> Ansonsten komm ich soweit gut klar, aber die beiden Sachen versteh ich
> irgendwie nicht. Kann mir da vllt. jemand gute Links zu Erklärungen
> geben?

"Reserved names include all external identifiers (global functions and 
variables) that begin with an underscore (‘_’) and all identifiers 
regardless of use that begin with either two underscores or an 
underscore followed by a capital letter are reserved names. This is so 
that the library and header files can define functions, variables, and 
macros for internal purposes without risk of conflict with names in user 
programs."

von laternenjoe (Gast)


Lesenswert?

Danke schonmal prx, das bringt schon mal Licht ins Dunkele. Also alle 
external deklarierten Variablen/Funktionen bekommen einen Unterstrich. 
Und doppelte Unterstriche (oder Unterstrich + Grossbuchstabe) werden in 
Bibliotheken benutzt (oder benutze ich selber in meinen H-Files?!) für 
alle Arten von Variablen/Funktionen wie ich gerade lustig bin? Oder wo 
genau ist der Unterschied in der Praxis?

von Max K. (laternenjoe)


Lesenswert?

Ja, danke und den Token-Pasting Operator hab ich verstanden. Verbindet 
Tokens, was zB bei verschachtelten structs eleganter sein kann.

von (prx) A. K. (prx)


Lesenswert?

laternenjoe schrieb:
> Danke schonmal prx, das bringt schon mal Licht ins Dunkele. Also alle
> external deklarierten Variablen/Funktionen bekommen einen Unterstrich.

Mal so und mal so, interessiert den C Programmierer aber normalerweise 
nicht, solange er nicht mit Assembler hantiert.

Vereinfachte Kurzfassung: Finger weg von selbst definierten Namen, die 
mit einem Unterstrich anfangen. Die gehören der Library.

Langfassung: In bestimmten Fällen sind Namen zulässig, die mit führendem 
Unterstrich und einem anschliessenden Kleinbuchstaben anfangen. Siehe 
C/C++ Standards. Ist aber nicht so trivial, eben weil abhängig vom 
Kontext. Relativ verbreitet ist das bei Membervariablen in C++.

"All identifiers that begin with an underscore and either an uppercase 
letter or another underscore are always reserved for any use."

"All identifiers that begin with an underscore are always reserved for 
use as identifiers with file scope in both the ordinary and tag name 
spaces."

: Bearbeitet durch User
von Max K. (laternenjoe)


Lesenswert?

Ok, werde das so machen. ...Ja, bis ich C mit allem Pipapo wirklich 100% 
verinnerlicht hab, werd ich noch ein bisschen programmiern müssen. Aber 
die Richtung stimmt aufjedenfall.

von Rolf M. (rmagnus)


Lesenswert?

laternenjoe schrieb:
> Danke schonmal prx, das bringt schon mal Licht ins Dunkele. Also alle
> external deklarierten Variablen/Funktionen bekommen einen Unterstrich.

Nein. Alle extern deklarierten Namen, die mit einem Unterstrich 
beginnen, sind reserviert für den Compiler.

> Und doppelte Unterstriche (oder Unterstrich + Grossbuchstabe) werden in
> Bibliotheken benutzt (oder benutze ich selber in meinen H-Files?!) für
> alle Arten von Variablen/Funktionen wie ich gerade lustig bin?

Nein. Auch die sind reserviert für den Compiler, und zwar egal, ob 
globale oder sonstwie definiert. Du darfst also selbst keine solchen 
Namen definieren.

von (prx) A. K. (prx)


Lesenswert?

A. K. schrieb:
> laternenjoe schrieb:
>> Danke schonmal prx, das bringt schon mal Licht ins Dunkele. Also alle
>> external deklarierten Variablen/Funktionen bekommen einen Unterstrich.
>
> Mal so und mal so, interessiert den C Programmierer aber normalerweise
> nicht, solange er nicht mit Assembler hantiert.

Klarstellung: Manche Compiler, die Assembler-Quelltext als Zwischencode 
erzeugen, hängen automatisch einen Unterstrich vor alle Namen, um nicht 
in Kollision mit reservierten Namen des Assemblers zu kommen. Meine 
Antwort bezog sich darauf. Für den Programmierer auf C Ebene bleibt das 
jedoch unsichtbar.

Der Programmier selbst sollte das nicht tun.

: Bearbeitet durch User
von Max K. (laternenjoe)


Lesenswert?

Ok, ich werde als C Programmierer keine identifier mit Unterstrich(en) 
deklarieren. Aus Interesse, gibt es nur eine begrenzte Anzahl an 
Assemblerbefehlen, die mit Unterstrichen beginnen dürfen? Oder ist das 
komplett falsch?

von (prx) A. K. (prx)


Lesenswert?

Max K. schrieb:
> Aus Interesse, gibt es nur eine begrenzte Anzahl an
> Assemblerbefehlen, die mit Unterstrichen beginnen dürfen? Oder ist das
> komplett falsch?

Nicht die Befehle sind das Problem, sondern die Register. So wärs bei 
x86 bei einem Assembler in Intel-Schreibweise besser, wenn die externe C 
Variable "ax" auf Asm-Ebene "_ax" heisst:
  mov ax, 1   ; Prozessor-Register AX
  mov _ax, 1  ; C Variable "ax"

: Bearbeitet durch User
von Max K. (laternenjoe)


Lesenswert?

Das leuchtet ein. Danke euch beiden!

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.