>Warum USART0_RX_vect_num wird nicht durch 20 esetzt?
Weil der Präprozessor nur einen Textersatz macht (und das nicht
rekursiv).
Das Ergebins von VVV ist "_vectorUSART0_RX_vect_num"
Ich nehme an, du möchtest als Ergebnis aber "_vector20" haben ?
Dann mußt du das so schreiben:
1 | #define USART0_RX_vect_num 20
|
2 | #define STR(x) #x
|
3 | #define _concat(x,y) x##y
|
4 | #define concat (x,y) _concat(x,y)
|
5 | #define VVV STR(concat(_vector, USART0_RX_vect_num))
|
concat übergibt einfach die Tokens an _concat, also: _concat(abc,def)
Beim Aufruf _concat schaut der Präprozessor nach ob abc oder def schon
definiert ist und ersetzt es gegebenenfalls.
Wenn es nicht definiert ist, bleibt der Name und wird nicht ersetzt).
_concat fügt die Parameter dann zusammen und übergibt dieses neue Token
STR, was dann einen String daraus macht.