Was läuft schief bei x=MAKRO(funktion()) ?

OP #725246
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));
Gast #725279
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

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