Präprozessor: wie richtig bezeichner zusammenleimen?
-
Servus. Folgender Code hat bei mir im MSVC immer gut funktioniert:
//Beispiel: STUB_ADPTMAP(myns,MyInput); erzeugt // template <> // struct Adaptermapping<myns__MyInputType> // { // typedef myns::GsoapAdapterMyInputType type; // }; #define STUB_ADPTMAP(ns,name) \ template <> \ struct Adaptermapping<ns##__##name##Type> \ { \ typedef ns##::GSoapAdapter##name type; \ } STUB_ADPTMAP(myns,NumbersInput); //Zeile 28... STUB_ADPTMAP(myns,StatusInput); STUB_ADPTMAP(myns,StatusResult); #undef STUB_ADPTMAPNun bekomme ich beim gcc aber folgende Meldungen:
./stubservices.h:28:1: das Einfügen von »<« und »myns« ergibt kein gültiges Präprozessor-Token ./stubservices.h:28:1: das Einfügen von »myns« und »::« ergibt kein gültiges Präprozessor-Token ./stubservices.h:29:1: das Einfügen von »<« und »myns« ergibt kein gültiges Präprozessor-Token ./stubservices.h:29:1: das Einfügen von »myns« und »::« ergibt kein gültiges Präprozessor-TokenWie mach ichs richtig? Ich hab ca. 54 mal STUB_ADPTMAP aufgerufen, ich will da nicht jedesmal den ganzen Schmu ausschreiben müssen...
-
#define ID(x) x #define CONCAT2(a,b) ID(a)ID(b)Versuch das mal

-
YASC schrieb:
#define ID(x) x #define CONCAT2(a,b) ID(a)ID(b)Versuch das mal

Naja wäre etwas arg kompliziert... Ich hab jetzt einfach hinter der öffnenden Templateklammer ein blank gesetzt und die ## vor den :: rausgenommen. Codepad schluckts jetzt, mal schauen was unser Integrations-GCC dazu sagt

-
Mit ## können nur gültige PP-Namen zusammengesetzt werden, d.h. alphanumerische bzw. der Unterstrich '_').
-
Th69 schrieb:
Mit ## können nur gültige PP-Namen zusammengesetzt werden, d.h. alphanumerische bzw. der Unterstrich '_').
Jein - es geht um gültige Token. Sowohl < als auch :: sind jeweils eigene Token, die man nicht an irgendwelche alphanumerischen Identifyer kleben sollte
