Forum: Compiler & IDEs #define Frage


von Bronko P. (bronko99)


Lesenswert?

N'abend,

folgendes Szenario:
1
uint8_t PD0;
2
uint8_t P0;
3
4
...
5
#define PORT_0        PD0,  P0 
6
7
#define IO_PORT_WRITE(x)                     IO_PORT_WRITE2(x)
8
#define IO_PORT_WRITE3(ddr, port, value)      port = value
9
10
...
11
IO_PORT_WRITE(PORT_0, 0xFF);


macro argument error ... sagt er

Warum haut das nicht hin?
Bronko

von P. S. (Gast)


Lesenswert?

Weil es IO_PORT_WRITE2 nicht gibt?

von Bronko P. (bronko99)


Lesenswert?

Da ist eigentlich eine 2.
Copy&Paste Fehler von mir.

von ... (Gast)


Lesenswert?

IO_PORT_WRITE hat nur ein Argument, Du übergibst 2!

von Floh (Gast)


Lesenswert?

Schau dir für solche Zwecke eher inline-Funktionen an, da meckert 
wenigstens der Compiler richtig :-)

von Bronko P. (bronko99)


Lesenswert?

Absolut logisch! Das wars, danke.

Falls das jemals jemand braucht:
1
uint8_t PD0;
2
uint8_t P0;
3
4
...
5
#define PORT_0        PD0,  P0 
6
7
#define IO_PORT_WRITE(x,value)                     IO_PORT_WRITE2(x,value)
8
#define IO_PORT_WRITE2(ddr, port, value)           port = value
9
10
...
11
IO_PORT_WRITE(PORT_0, 0xFF);

von holger (Gast)


Lesenswert?

>Falls das jemals jemand braucht:

Wozu soll das gut sein?

>#define IO_PORT_WRITE(x,value)                     IO_PORT_WRITE2(x,value)

Doppelt hält besser oder was?

von Yalu X. (yalu) (Moderator)


Lesenswert?

> Doppelt hält besser oder was?

Beim C-Präprozessor mit seinen nicht ganz einfachen Expansionsregeln
muss man manchmal etwas doppelt machen, das ist schon ok.

Ich frage mich aber trotzdem, wozu das gut sein soll, zumal das erste
Argument von IO_PORT_WRITE2 gar nicht benutzt wird.

von Bronko P. (bronko99)


Lesenswert?

OK, weils euch interessiert. Ziel war es eine möglichst effektive IO pin 
Abstraktion für alle uC, die ich programmiere, zu haben. D,h. folgende 
Zeile funktioniert sofort beim AVR, PIC, R8C, ..., weil das Makro in 
einem Headerfile z.B. io.h ist und ich somit nur noch das Macro anfassen 
muss und dessen Argument, das restliche Programm bleibt unverändert.

IO_PORT_WRITE(PORT_0, 0xFF);

Das mit inline ist mir bekannt und ist auch die "bessere" Lösung. Das 
inline ist unter Umständen compilerspezifisch.

Gruß
Bronko

PS: Das zweite Argument ist für das dataDirektion Makro gut
    Es gibt noch weitere Makros

von Yalu X. (yalu) (Moderator)


Lesenswert?

Bronko Pavel schrieb:
> PS: Das zweite Argument ist für das dataDirektion Makro gut
>     Es gibt noch weitere Makros

Ok, in diesem Kontext ergibt die Sache einen Sinn.

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.