mikrocontroller.net

Forum: Compiler & IDEs Precompiler PIN Abfrage


Autor: Norbert S. (norton)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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 E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.