Forum: Compiler & IDEs Makros mit ##


von Mika (Gast)


Lesenswert?

Hallo!

Ich woltle gern in einem Header-File
1
#define LED_PORT P2
2
#define PORTDIR(port)  port##DIR
definieren und im Code dann
1
PORTDIR(LED_PORT)
 verwenden, um "P2DIR" zu erhalten.

Allerdings habe ich das Problem, dass die Variable LED_PORT nicht in 
"P2" umgewandelt wird und ich somit "LED_PORTDIR" erhalte, was natürlich 
zu einem Fehler führt.

Kann man das irgendwie korrigieren?

Vielen Dank für eure Hilfe!

Gruß
Mika

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Du musst das zweistufig machen:
1
#define LED_PORT P2
2
#define PORTDIR_(port) port##DIR
3
#define PORTDIR(port)  PORTDIR_(port)

Frag mich bitte nicht, warum das so im Standard definiert ist :),
ich vermute, dass es einen Grund gibt...

von Mika (Gast)


Lesenswert?

Hallo!

Danke für die Antwort!

Hab eben auch was gefunden:
{c]#define GLUE2(a, b)       a ## b
#define GLUE3(a, b, c)    a ## b ## c
#define CONCAT2(a, b)     GLUE2(a, b)
#define CONCAT3(a, b, c)  GLUE3(a, b, c)

#define PORTOUT(port)     CONCAT2(port,OUT)
#define PORTIN(port)      CONCAT2(port,IN)
#define PORTDIR(port)     CONCAT2(port,DIR)
#define PORTSEL(port)     CONCAT2(port,SEL)[/c]
(steht bei mir in makros.h)

Eigentlich funktionierts, bis auf eine Stelle.
Das sagt der Compiler immer, dass LED_PORT implizit deklariert ist.
Aber das steht im led.h-File drin. Und das nur bei PORTOUT. Mit dem 
weiteren Hinweis:
1
Error[Pe137]: expression must be a modifiable lvalue

Verstehe nicht warum ...

von Peter D. (peda)


Lesenswert?


von Mika (Gast)


Lesenswert?

Hallo!

Mit der Variante von Jörg, hat sich beim Compiler-Fehler gelöst
1
#define _PORTOUT(port)    port ## OUT
2
#define PORTOUT(port)     _PORTOUT(port

von Mika (Gast)


Lesenswert?

Danke noch mal für eure Hilfe!

von Rolf Magnus (Gast)


Lesenswert?

Jörg Wunsch schrieb:
> Du musst das zweistufig machen:
>
> #define LED_PORT P2
> #define PORTDIR_(port) port##DIR
> #define PORTDIR(port)  PORTDIR_(port)
>
>
> Frag mich bitte nicht, warum das so im Standard definiert ist :),
> ich vermute, dass es einen Grund gibt...

Der Token-Pasting-Operator löst keine Makros auf. Er nimmt also genau 
das, was als port ans Makro übergeben wird. Wenn er das nicht tun würde, 
aber man genau das wollte, wie sollte man das sonst tun?
Im vorliegenden Fall will man es aber nicht, denn es würde aus dem hier:
1
PORTDIR(LED_PORT)
2
[/C}
3
das da:
4
[C]
5
LED_PORTDIR

Hier will man, daß LED_PORT durch P2 ersetzt wird, und
1
#define PORTDIR(port)  PORTDIR_(port)
macht nun beim Aufruf diese Ersetzung.

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.