Forum: Compiler & IDEs Precompiler PIN Abfrage


von Norbert S. (norton)


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

von Karl H. (kbuchegg)


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.

von Oliver (Gast)


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

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.