#define INSTANCE USART0
#define FOO RCU_ ## INSTANCE
expandiert zu RCU_INSTANCE was ich NICHT haben will.
Ich will etwas das zu RCU_USART0 expandiert.
Kann jemand dieses verzwickte Problem lösen?
Jörg W. schrieb:> Hmm:
Du warst zu schnell, habs nochmal editiert, ich hab eine falsche
variante gecopypastet. Sorry.
Ich hab schon eine geschlagene Stunde rumexperimentiert mit allen
möglichen Kombinationen von Strinify und expand makros und bekomms
einfach nicht hin, dieses komische Verhalten von cpp wird sich mir wohl
für immer entziehen.
Danke!
Warum braucht er zwei davon? Irgendwo stand geschrieben daß
Makro-Parameter expandiert werden, warum passierts dann nicht schon beim
ersten Mal? Und wenns beim ersten Mal nicht geht warum dann beim zweiten
Mal, was ist der Unterschied?
Bernd K. schrieb:> Warum braucht er zwei davon?
Ich glaub das versteht keiner so genau. Hat irgendwas damit zu tun wann
genau die Substitution passiert. So richtig durchgeblickt hab ich da
auch nicht, man fügt immer mehr Evaluations-Ebenen hinzu bis es geht...
Der korrekte Weg ist es, so wenig wie Möglich mit Makros zu machen und
stattdessen Klassen, Templates und constexpr zu nehmen...
Dr. Sommer schrieb:> Der korrekte Weg ist es, so wenig wie Möglich mit Makros zu machen und> stattdessen Klassen, Templates und constexpr zu nehmen...
Wenn man aber, wie hier, aus irgendeinem Grund komplette Bezeichner
synthetisieren muss, geht's nicht groß anders zu machen.
Jörg W. schrieb:> Wenn man aber, wie hier, aus irgendeinem Grund komplette Bezeichner> synthetisieren muss, geht's nicht groß anders zu machen.
Ja, dazu müsste man wenn schon das ganze System umstellen, sodass man
dann RCU.USART0 oder so hat.
Bernd K. schrieb:> Jetzt expandiert er zu tief:
Oh nein, dann solltest du das ganz anders machen. Nur eine ganz
bestimmte Evaluations-Tiefe haben zu wollen wird früher oder später
schief gehen. Mache "#define INSTANCE USART0x" oder so.
Was genau ist denn dieses RCU_USART0?
PS: "P" ist ein nicht so guter Name für ein Makro. Die sollten lang und
auffällig sein, damit man nicht versehentlich einen C-Bezeichner so
nennt...
Dr. Sommer schrieb:> Was genau ist denn dieses RCU_USART0?
Das ist definiert als ein Eintrag in einem enum in dessen numerischem
Wert eine Registeradresse und eine Bitposition kodiert ist welche sich
deren rcu_periph_clock_enable() Funktion dann dort wieder rauspopelt um
irgendwo ein Bit zu setzen um den Takt einzuschalten.
> dann solltest du das ganz anders machen.
Ja. Ich hab mich da verzettelt. Ich wollte das über-elegant lösen, mal
eben ganz fix in 1 Minute und lande stattdessen für 2 Stunden in der
Makro-Hölle.
Dr. Sommer schrieb:> Wie wäre es mit sowas in der Art:struct UartInstance {> uint32_t addr;> uint32_t rcu;> };>> static const UartInstance instUART0 = { USART0, RCU_USART0 };> static const UartInstance instUART1 = { USART1, RCU_USART1 };>> #define INSTANCE instUART0
Ja, ich glaub sowas in der Art ist noch am saubersten.