Precompiler PIN Abfrage

OP #860310
Lesenswert?

Hallo, kann mir vieleicht jemand weiterhelfen, warum bei folgendem Code 
der GCC einen Fehler ausgibt?
1
#define XYZ    10
2
#if PIND == XYZ
3
  #error "test"
4
#endif

Fehlermeldung:

../lib_dip_switch.c:30:5: error: operator '*' has no left operand
make: *** [lib_dip_switch.o] Error 1
Build failed with 1 errors and 0 warnings...

Gruß Norton
#860318
Lesenswert?

Norbert S. wrote:
> Hallo, kann mir vieleicht jemand weiterhelfen, warum bei folgendem Code
> der GCC einen Fehler ausgibt?
>
>
1
> #define XYZ    10
2
> #if PIND == XYZ
3
>   #error "test"
4
> #endif
5
>
>
> Fehlermeldung:
>
> ../lib_dip_switch.c:30:5: error: operator '*' has no left operand

Was ist PIND?
PIND ist ein Makro, das seinerseits zu so was expandiert
#define PIND *(volatile unsigned char*)0x20

Damit steht da nach der Makroexpansion

#if *(volatile unsigned char*)0x20 == XYZ

Und da wird offenbar der eigentlich als Dereferenzierungsoperator
gedacht erste * nicht als Dereferenzierung benutzt sondern als
Multiplikation. Macht ja auch Sinn: Wie soll der Präprozessor
einen Pointer dereferenzieren? Der Präprozessor macht Textersetzungen
und kann zur Not auch noch einfache Arithmetik machen (wenn ich
mich nicht irre), das wars dann aber auch schon.
Gast #860322
Lesenswert?

PIND ist über io.h in etwa so definiert
1
#define PIND  _SFR_IO8(0x10)
mit
1
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
Das kriegt der Preprozessor in einem #if nicht auseinandergefieselt. Der 
kann nur einfaches
1
#define IRGENDWAS 10
2

3
#if IRGENDWAS == 10
4
 #error "xx"
5
#endif
Oliver

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