www.mikrocontroller.net

Forum: Compiler & IDEs Makros mit ##


Autor: Mika (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich woltle gern in einem Header-File
#define LED_PORT P2
#define PORTDIR(port)  port##DIR
definieren und im Code dann
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Mika (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Error[Pe137]: expression must be a modifiable lvalue

Verstehe nicht warum ...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Mika (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

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

Autor: Mika (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke noch mal für eure Hilfe!

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
PORTDIR(LED_PORT)
[/C}
das da:
[C]
LED_PORTDIR

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.