Präprozessor und Verkettung - Problem!



  • EDIT: Hab mich geirrt, geht doch. fricky hat's drauf! 🙂



  • _matze schrieb:

    ...

    drei pünktchen? 😕
    🙂



  • ~fricky schrieb:

    _matze schrieb:

    ...

    drei pünktchen? 😕
    🙂

    Ich war mir sicher, das geht nicht und hab das halbwegs ausführlich erklärt! Dann hast du gepostet, und da dachte ich mir, bevor ich mich lächerlich mache (was ich hiermit tue), wird's erstmal schnell wieder gelöscht... 😃



  • Erstmal danke für die super schnelle Antwort 🙂

    Doch der Compiler bemeckert einen Fehler: char* ist nicht u8 ...

    Kann es sein, dass dein Vorschlag auf folgendes Ergebnis kommt:

    #define DEF1 "PRAEFIX_20_SUFFIX1"
    

    ???

    Wenn ja, dann wird das doch als char angesehn und nicht mehr weiter ersetzt oder? Kann das sein? Wenn ja, wie bekomme ich das gleiche Ergebnis, nur ohne Anführungszeichen?

    Danke mal für die Hilfe 🙂



  • Tja, er setzt dir nur einen String zusammen. Dann klappt's wohl doch nicht... konnte ich mir auch nur schwer vorstellen...



  • _matze schrieb:

    ...und da dachte ich mir, bevor ich mich lächerlich mache (was ich hiermit tue), wird's erstmal schnell wieder gelöscht

    jaja, die allgegenwärtige angst registrierter user vor ewiger schande. 😉

    Hundehaufen schrieb:

    Kann das sein? Wenn ja, wie bekomme ich das gleiche Ergebnis, nur ohne Anführungszeichen?

    so dass du's z.b. als variablenname verwenden kannst?
    so etwa:

    #define ZAHL 20
    #define PREFIX lala_
    #define SUFFIX _dumm
    
    #define MK(x) x
    #define M1(x) MK(PREFIX)##MK(x)
    #define M2(x) M1(x)##MK(SUFFIX)
    #define DEF1 M2(ZAHL)
    
    void main (void)
    {
      int DEF1; // <-- ist das lala_20_dumm ?
      lala_20_dumm = 3; // <-- beweis: compiler meckert nicht
    }
    

    ^^geht zumindest mit meinem compiler. kann aber sein, dass man's noch vereinfachen kann.
    🙂



  • ~fricky schrieb:

    ^^geht zumindest mit meinem compiler. kann aber sein, dass man's noch vereinfachen kann.
    🙂

    Check this out:

    #define MK(x) x
    #define M1(x) MK(x)
    #define KAGGA(x) M1(A_##x##_B)
    
    int main()
    {
    	int KAGGA(99);
    	A_99_B = 88;
    	return 0;
    }
    

    🕶



  • Big Brother schrieb:

    Check this out:

    du hast vergessen, ZAHL, PREFIX und SUFFIX einzubauen.
    🙂



  • Ömm, die Zahl ist das x.
    Präfix und Süffix ist 'festgebrannt' als A und B.
    🙂



  • B.B. schrieb:

    Ömm, die Zahl ist das x.
    Präfix und Süffix ist 'festgebrannt' als A und B.

    das eigentliche anliegen des OP war doch gerade, dass der preprozzi diese #defines nicht expandiert hat. die kannste jetzt doch nicht einfach rausschmeissen.
    🙂



  • Das ist wegoptimiert :p
    Dachte, der OP will nen variablen Mittelteil des Macros.
    Hab ich wohl nicht aufgepasst.



  • ~fricky - du bist super! 🙂 ⚠ 👍

    Also, dein Vorschlag war:

    #define ZAHL 20
    #define PREFIX lala_
    #define SUFFIX _dumm
    
    #define MK(x) x
    #define M1(x) MK(PREFIX)##MK(x)
    #define M2(x) M1(x)##MK(SUFFIX)
    #define DEF1 M2(ZAHL)
    
    void main (void)
    {
      int DEF1; // <-- ist das lala_20_dumm ?
      lala_20_dumm = 3; // <-- beweis: compiler meckert nicht
    }
    

    Das hab ich so ausprobiert, aber festgestellt, dass mein Compiler diese Makros nicht verkettet hat, es kam immer "lala_" raus, den Rest hat er verschluckt. Dann hab ich das leicht modifiziert und sieht jetzt so aus:

    #define ZAHL 20
    #define PREFIX lala_
    #define SUFFIX _dumm
    
    #define M1(x,y,z) x##y##z
    #define M2(x,y,z) M1(x,y,z)
    #define DEF1 M2(PREFIX,ZAHL,SUFFIX)
    

    Und siehe da - das funktioniert 🙂 🙂

    Der Sinn des ganzen ist, dass die Defines der Form "lala_20_dumm" bereits existieren und sowohl die Zahl als auch das Suffix sich verändern können. Aber so kann ich jetzt immer das aus den drei Teilen zusammenbauen, was unheimlich viel Code spart.

    Echt danke ~fricky 😃



  • Glücklicher Hundehaufen schrieb:

    Echt danke ~fricky

    gern geschehen.
    🙂


Anmelden zum Antworten