mikrocontroller.net

Forum: Compiler & IDEs #ifdef, #elif, #else und #endif


Autor: Robert Schilling (razer6)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle!

Ich und ein Freund schreiben gerade an einer universellen Lib für den
PCF8574 und den PCF8574A.

In der Header Datei soll asugewählt werden welcher der beiden ICs
verwendet wird.
#ifdef PCF_8574
  #define PCF8574_ADRESS 0b01000000  //Standardadressendes PCF8574
#elif PCF_8574A
  #define PCF8574_ADRESS 0b01110000  //Standardadresse des PCF8574A
#else
  #error "Sie haben keinen oder einen falschen IC in pcf8574.h
ausgewaehlt!!\n"
#endif

Oben definiere ich
#define PCF_8574

oder
#define PCF_8574A

Wenn ich PCF8574 definier funktioniert alles. Doch wenn ich mit dem
PCF8574A arbeiten will, Bekomme ich immer die Fehlermeldung??

Warum denn??

Ich hoffe es kann mir wer helfen.

Gruß Robert

Autor: Robert Schilling (razer6)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider hat er oben die Fehlermeldung geteilt. Das ist im Code nicht so.

Autor: kosmonaut pirx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,
dein 'elif' schaut nach, ob PCF_8574A true ist. du willst sicher ein


#elif defined PCF_8574A

machen. vermute ich.
siehe auch
http://de.wikibooks.org/wiki/C-Programmierung:_Pr%...

hth

Autor: Detlev (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Fehler dürfte sein, dass #elif kein #ifdef beinhaltet

#elif PCF_8574A

Du meinst wahrscheinlich
#else
#ifdef PCF_8574A

benötigt noch ein zweites #endif am Ende.

Autor: Robert Schilling (razer6)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alternative:

#define PCF_8574 1
#define PCF_8574A 2

(Bitte nicht die 0 benutzen.)

...compiliert mit -DDEVICE=PCF_8574 (zum Beispiel), die Abfrage
dann als:

#if DEVICE == PCF_8574
...
#elif DEVICE == PCF_8574A
...
#else
#  error "DEVICE not defined."
#endif

Präprozessordirektiven haben übrigens das # immer in Spalte 1.
Seit C89 ist zusätzlich zwischen dem # und der eigentlichen
Direktive auch Leerraum zugelassen, offiziell aber nicht davor.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> (Bitte nicht die 0 benutzen.) <<
Warum nicht?

Cheers
Detlef

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> (Bitte nicht die 0 benutzen.) <<
>Warum nicht?

Vermutlich weil die 0 auch auch als logisch falsch angenommen wird. Das
wäre dann so als würde man fragen "#ifndef PCF_8574"...

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nee, da würde dann stehen:

#if DEVICE == 0

und da kann ich nix falsches entdecken !?

Cheers
Detlef

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn einer DEVICE nicht definiert, du es aber in einer #if-Abfrage
benutzt, wird es implizit mit 0 angenommen.  Damit wäre einer
deiner Vergleiche danach zutreffend.  Wenn du -Wundef in den
Compileroptionen hast, gibt's dafür zumindest eine Warnung.

Autor: Detlef _a (detlef_a)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, wieder was dabeigelernt.

Cheers
Detlef

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.