Vergleich Präprozessor-Makro

OP #5725202
Lesenswert?

Hallo zusammen,

ich bin auf einem STM32 mit dem ARM-GCC. Ich will ein vordefiniertes 
Makro mit einem anderen vergleichen. Konkret in etwa so:

1
    #if( INPUT_CLK_GPIO == GPIOA )
2
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
3
    #else
4
        #error "Invalid/non-implemente GPIO for Clock input"
5
    #endif

Dabei ist definiert:
1
    #define INPUT_CLK_GPIO GPIOA
2
    #define GPIOA               ((GPIO_TypeDef *) GPIOA_BASE)
3
    #define GPIOA_BASE            (APB2PERIPH_BASE + 0x0800)
4
    u.s.w.

So funktioniert das nicht. Der Compiler/Präprozessor wirft mir vor: 
"error: operator '*' has no right operand". Den Teil verstehe ich schon 
einmal nicht. Nach der Präzprozessor-Orgie steht da ja etwas wie:
1
 struct{ ... } * 1234 == struct{ ... } * 1234
mit einer garantiert anderen Zahl.

Daher meine zwei (voneinander unabhängigen) Fragen:

 a) Wie kann ich dem Präprozessor beibringen, zur prüfen, ob die beiden 
Makros (also die Zeiger) äquivalent sind und

 b) Wie kommt der Compiler bei diesem Konstrukt von oben auf die 
Fehlermeldung?

Viele Grüße
W.T.
Gast #5725225
Lesenswert?

Dann füge noch ein static_assert(INPUT_CLK_GPIO == GPIOA); hinzu.
Alternativ so:
1
#define INPUT_CLK_GPIO GPIOA
2
#define INPUT_CLK_BUS RCC_APB2Periph_GPIOA
3

4
RCC_APB2PeriphClockCmd (INPUT_CLK_BUS, ENABLE);

Dann kannst du an zentraler Stelle Port und zugehörigen Takt einstellen. 
Nicht besonders schön, aber so ist das nunmal wenn man unbedingt C und 
kein böses OOP verwenden möchte :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren