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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.