C-Präprozessor - # und ## Operatoren
Den C99-standard-Dokument hat das folgende Beispiel, in dem Abschnitt über die ## preprocessing-Betreiber:
Im folgenden fragment:
#define hash_hash # ## # #define mkstr(a) # a #define in_between(a) mkstr(a) #define join(c, d) in_between(c hash_hash d) char p[] = join(x, y); //equivalent to //char p[] = "x ## y";
Den ausbau produziert, an verschiedenen
Stufen:join(x, y) in_between(x hash_hash y) in_between(x ## y) mkstr(x ## y) "x ## y"
In anderen Worten, die Erweiterung hash_hash
erzeugt ein neues token, bestehend aus
zwei benachbarte scharfen Schildern, aber dieses neue
token ist nicht der # # - operator.
Ich verstehe nicht, warum die substitution von hash_hash produziert ## und nicht "##" oder "#""#". Welche Rolle werden die einzelnen Hashwerte vor und nach dem Doppel-hash-spielen?
Alle Antworten sehr dankbar.
- single-hashes vor und nach ## sind nur chars, und ## (token) wird Ihnen in zwei Zeichen ## (nicht in token). nach der Anwendung eines mkstr Ihnen, Sie werden in eine Zeichenfolge konvertiert werden von "##"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
##
im# ## #
wirkt wie eine escape-Sequenz, die in diesem Ausdruck. Es verkettet die äußerste linke und die äußerste Rechte#
bis schließlich produzieren die token##
. Einfach die Definition der makro-als##
würde einen Fehler verursachen, da der operator erwartet zwei Operanden.# ## #
bedeutet##
und nicht"##"
gefolgt von einem syntax-Fehler (weil die restlichen#
keinen rechten Operanden)? - Hat##
haben Vorrang vor#
?