Datum: 06.05.2008 10:24
Hallo, kann mir vieleicht jemand weiterhelfen, warum bei folgendem Code der GCC einen Fehler ausgibt?
#define XYZ 10 #if PIND == XYZ #error "test" #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
Datum: 06.05.2008 10:37
Norbert S. wrote: > Hallo, kann mir vieleicht jemand weiterhelfen, warum bei folgendem Code > der GCC einen Fehler ausgibt? > >
> #define XYZ 10 > #if PIND == XYZ > #error "test" > #endif > |
> > 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.
Datum: 06.05.2008 10:39
PIND ist über io.h in etwa so definiert
#define PIND _SFR_IO8(0x10) |
mit
#define _SFR_IO8(io_addr) ((io_addr) + __SFR_OFFSET)
|
Das kriegt der Preprozessor in einem #if nicht auseinandergefieselt. Der kann nur einfaches
#define IRGENDWAS 10 #if IRGENDWAS == 10 #error "xx" #endif |
Oliver
Antwort schreiben
Die Angabe einer Email-Adresse ist freiwillig. Wenn Sie automatisch per Email über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.
Wichtige Regeln - erst lesen, dann posten!
- Suchfunktion und Betreffsuche benutzen - vielleicht gibt es schon einen ähnlichen Beitrag
- Aussagekräftigen Betreff wählen
- Im Betreff angeben um welchen Controllertyp es geht (AVR, PIC, ...)
- Groß- und Kleinschreibung verwenden
- Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang
- JPEG-Dateien (.jpg) nur für Fotos verwenden, Schaltpläne, Screenshots usw. als PNG oder GIF anhängen
Formatierung (mehr Informationen...)
- [c]C-Code[/c]
- [avrasm]AVR-Assembler-Code[/avrasm]
- [pre]vorformatierter Text (z.B. Code in anderen Sprachen)[/pre]
- [math]Formel in LaTeX-Syntax[/math]
- [[Titel]] - Link zu Artikel