Frage zu ## Operator



  • Hallo zusammen,

    ich bin gerade über folgende Anweisung gestolpert:

    #define CONCAT(a,b) a##b
    #define TOGGLE(a,b) CONCAT(PORT,a) ^= (1 << (b))
    
    void foo(void)
    {
            TOGGLE(D, 4);
            TOGGLE(A, 0);
    }
    

    Mir ist dabei nicht ganz klar, was #define CONCAT(a,b) a##b
    genau macht. Es fügt PORT und D bzw. A zu einem PORTD bzw. PORTA zusammen oder?
    Ich hab diese Schreibweise noch nie gesehen. Ist das ANSI-C?

    Gruß



  • a##b ist eine Präprozessor Anweisung. Sie sagt: füge a an b an. Wenn a aber ein Makro ist, wird das vorher expanded.

    Wenn du also zB
    CONCAT(Hallo, Welt) sagst, dann bekommst du HalloWelt

    Beachte, dass HalloWelt kein String ist - sondern wirklich der Bezeichner HalloWelt.

    Dein TOGGLE macht nun folgendes. Wenn PORT nun zB COM wäre, dann würde aus TOGGLE folgendes:
    TOGGLE(D, 4);
    wird zu
    COMD ^= (1 << (4));

    Sollte man aber sehr sehr spärlich einsetzen...



  • Ah ok, vielen Dank 🙂

    Shade Of Mine schrieb:

    Sollte man aber sehr sehr spärlich einsetzen...

    Warum?

    Gruß


Anmelden zum Antworten