Forum: Compiler & IDEs Was läuft schief bei x=MAKRO(funktion()) ?


von Frank N. (betafrank)


Lesenswert?

Hallo, kann mir jemand vom Schlauch helfen? Wieso klappt die 
Verschachtelung nicht (Müll landet in Var)?
1
#define  BCD2BIN(b)  (((b)&0xf) + ((b)>>4)*10)
2
3
U8 read_iic_ack(void){...return U8;}
4
5
void read_RTC(void){
6
   U8 Var;
7
   Var = BCD2BIN(read_iic_ack());
8
}

Aber folgendes funktioniert super?
1
#define  BCD2BIN(b)  (((b)&0xf) + ((b)>>4)*10)
2
3
U8 read_iic_ack(void){...return U8;}
4
5
void read_RTC(void){
6
   U8 Var;
7
   Var = read_iic_ack();
8
   Var = BCD2BIN(Var);
9
}

BTW, folgendes klappt perfekt:
1
#define  BIN2BCD(b)  (((b)%10) | (((b)/10)<<4))
2
...
3
write_iic(BIN2BCD(Var));

von Bernhard (Gast)


Lesenswert?

Hallo Frank,
Macros machen eine reine Textersetzung (im Precompiler, also vor 
Compilation). Das gibt im obigen Beispiel folgendes:

#define  BCD2BIN(b)  (((b)&0xf) + ((b)>>4)*10)
...
   Var = BCD2BIN(read_iic_ack());

Das letztere wird zu

   Var = (((read_iic_ack())&0xf) + ((read_iic_ack())>>4)*10);

Klar?

Grüße
Bernhard

von Frank N. (betafrank)


Lesenswert?

Hallo Bernhard,

nach 5 Minuten mal Abschalten ist mir aufgegangen, daß genau das von Dir 
beschriebene passiert.

Ups & danke - Frank

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.