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 HalloWeltBeachte, 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ß