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

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.