Forum: Compiler & IDEs IAR Workbench: Glue - Parameter nicht weiter auflösen


von Patex (Gast)


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" ;)

von Oliver (Gast)


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

von Patex (Gast)


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).

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.