Ich habe zwei C-Makros, die erste im Grunde zwei Token ist verkettenMake-Token Verkettung vor stringification in C Makro
#define _PY_CLASS_NAME(name) Py##name
Der zweite Makro wird stringifying Eingabeargument
#define STR(text) #text
Wegen der Art und Weise C Präprozessor Arbeit, wenn ich etwas wie
versuchenSTR(_PY_CLASS_NAME(name))
Ich bekomme tatsächlich "_PY_C LASS_NAME (Name) ". So ist die Frage, wie man es vermeidet?
habe ich versucht, so etwas wie
#define CONCAT(A, B) #A###B
und es funktioniert. Aber vielleicht ist es ein besserer Weg, es zu tun?
Beachten Sie, dass Sie keine Namen erstellen sollten, die mit einem Unterstrich gefolgt von einem anderen Unterstrich oder einem Großbuchstaben beginnen. Solche Namen sind durch die Implementierung "für jede Verwendung reserviert". Siehe [C11 §7.1.3 Reservierte Identifikatoren] (http://port70.net/~nsz/c/c11/n1570.html#7.1.3). –
Im Beispiel "#define CONCAT (A, B) #A ### B" kann der Präprozessor beschweren, dass der Operator '##' nicht zwei Bezeichner verbindet. Die Regel 'maximales Knabbern' bedeutet, dass Sie '#A ## # B' haben und' #B' kein Identifikator ist. Sie sollten es sicherlich nicht versuchen. –
Siehe auch [Wie verkettet man zweimal mit dem C-Präprozessor und expandiert ein Makro wie in 'arg ## _ ## MACRO'?] (Https://stackoverflow.com/questions/1489932/) und [Wie man ein Zeichen erstellt String aus einem C-Makro-Wert?] (https://StackOverflow.com/Questions/195975/) –