IAR Workbench: Glue - Parameter nicht weiter auflösen

Gast #3264843
Hallo!

ich versuche gerade mir mit ein paar geschickten Makros das Leben zu 
vereinfachen. - Dabei bin ich aber gerade auf ein Problem gestoßen.

Unter der Verwendung des GLUE-Operators (##) wollte ich mir ein paar 
generische Makros schreiben um auf entsprechende Register zuzugreifen.
Das Problem: Ein define Wert lautet zum Beispiel
1
#define CTRL_PORT PORTB
2
#define REGISTER(value)  REGISTER_##value
Beim kompilieren bekam ich eine Fehlermeldung, dass es REGISTER_ nicht 
gibt.
Die Ursache,liegt darin, dass UART1 im Prozessorheaderfile als Struktur 
definiert ist. (Das Makro funktioniert ansonsten REGISTER(BLA) ergibt 
REGISTER_BLA).

Gibt es eine Möglichkeit zu verhindern, dass der Preprozessor "PORTB" 
weiter auflöst sondern als das Wort "PORTB" verwendet, so dass ich 
"REGISTER_PORTB" erhalte, wenn ich REGISTER(CTRL_PORT) eingebe?

Danke & Gruß

"Patex" ;)
Gast
Patex schrieb:

Ich schätze mal, dein Problem liegt genau hier:

> ich versuche gerade mir mit ein paar geschickten Makros das Leben zu
> vereinfachen.

in 99,999999999% der Fälle geht der Schuß nach hinten los.

> so dass ich
> "REGISTER_PORTB" erhalte, wenn ich REGISTER(CTRL_PORT) eingebe?

Mal eben schnell getestet. Bei mir ergibt dein folgende Code mit "gcc -E 
out.c" genau das, was du willst.
1
#define PORTB (*((volatile int *)0x1234))
2
#define CTRL_PORT PORTB
3
#define REGISTER(value)  REGISTER_##value 
4

5
int main()
6
{
7
  int j = PORTB;
8
  int i = REGISTER(PORTB);
9
  
10
}

ergibt
1
# 1 "out.c"
2
# 1 "<built-in>"
3
# 1 "<command-line>"
4
# 1 "out.c"
5
# 9 "out.c"
6
int main()
7
{
8
 int j = (*((volatile int *)0x1234));
9
 int i = REGISTER_PORTB;
10

11
}

Wofür das gut sein soll, musst du selber wissen...

Oliver
Gast
Das wäre ja das, was ich will und auch das, was ich als Code vorliegen 
habe.
Aber das Ergebnis entspricht nicht dem des Compilers in IAR Workbench 
(hier gibt es ja kein (Embedded) C/C++-Programmierungsforum, sondern nur 
GCC und PC-Programmierung).

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.