Fragen zu Preprozessor(Token-Pasting Operator, Unterstriche)

OP #4285770
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?
#4285785
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."
Gast #4285810
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?
#4285846
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."
#4285860
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.
#4285874
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.
#4285911
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"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren