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?
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?
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."
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?
Ja, danke und den Token-Pasting Operator hab ich verstanden. Verbindet Tokens, was zB bei verschachtelten structs eleganter sein kann.
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
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.
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.
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
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?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.