2017-12-29 18 views
0

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

versuchen
STR(_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?

+0

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). –

+0

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. –

+0

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/) –

Antwort

1
#define _PY_CLASS_NAME(name) Py##name 
#define STR(a) STR_(a) 
#define STR_(a) #a 

Dies löst das Problem auf andere Weise und würde auch klären, wie es Makro funktioniert. Grund ist - wenn Makroargumente im Makrokörper ersetzt werden, werden sie erweitert, bis sie mit den Vorprozessoroperatoren oder ## in diesem Makro angezeigt werden.

Jetzt tun dies printf("%s\n",STR(_PY_CLASS_NAME(name))); Drucke Pyname.

Bearbeiten: Die zweite, die Sie erwähnt, wird nicht funktionieren. Der Compiler klagt wie erwähnt über das Fehlen eines gültigen Vorverarbeitungstokens.