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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.