IAR Workbench: Glue - Parameter nicht weiter auflösen

Gast #3264843
Lesenswert?

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 #3264878
Lesenswert?

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 #3264889
Lesenswert?

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

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