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_ADPTMAP
    

    Nun 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-Token
    

    Wie 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 😉


Anmelden zum Antworten