2016-05-16 8 views
1

Hier verketten ist der Code:Ärger mit dem Prä-Prozessor - wenn „name“ und „=“ als Token

#define STR_CONCAT_IMPL(s1, s2) s1##s2 
#define STR_CONCAT(s1, s2) STR_CONCAT_IMPL(s1, s2) 
#define TOSTR_IMPL(x) #x 
#define TOSTR(x) TOSTR_IMPL(x) 
#define STR_CONCAT_TOSTR(s1, s2) TOSTR(STR_CONCAT(s1, s2)) 

int main() { 
    const char* a = STR_CONCAT_TOSTR(name, p); // works 
    const char* b = STR_CONCAT_TOSTR(name, =); // doesn't work 
    return 0; 
} 

ich eine Zeichenfolge wie "name=" von "name" bei der Kompilierung benötigen (Runtime-Verkettung keiner Option), so ich habe versucht, mit meinen alten Makros, aber ich bekomme diese Fehlermeldung:

error: pasting "name" and "=" does not give a valid preprocessing token 

aber wenn nicht mit = aber ein normales Zeichen - es funktioniert.

Wie kann ich das zum Funktionieren bringen?

C++ 98 GCC/MSVC-Lösung benötigt.

Antwort

5

Ich nehme an, Sie brauchen ein Makro dafür und können nicht nur den Compiler selbst verwenden.

Nutzen Sie die Vorteile von benachbarten Stringliterale verkettet werden:

#define STR_CONCAT_TOSTR(s1, s2) TOSTR(s1) TOSTR(s2) 

In diesem Fall STR_CONCAT_TOSTR(name, =) expandiert nach "name" "=", die der Compiler in "name=" verwandelt.

1

Das liegt daran, name= ist kein Token, es ist zwei. Im Gegensatz zu namep können sie nicht eingefügt werden, um ein einzelnes Token zu erzeugen.

Alles, was Sie tun müssen, ist STR_CONCAT_TOSTR unterschiedlich definieren die Stringliterale der Ausgangs Tokens verketten, anstatt die Zeichen zu versuchen, zuerst zu verketten:

#define STR_CONCAT_TOSTR(s1, s2) (TOSTR(s1) TOSTR(s2)) 
+0

Ich erkenne dein Avatar - Epos gleichzeitige Sachen auf Github! – onqtam

+0

Haha, danke :-) – Cameron