Makros mit ##

Gast #1667688
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
Gast #1667730
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 ...
Gast #1667961
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.

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