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


von Robert S. (razer6)


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.
1
#ifdef PCF_8574
2
  #define PCF8574_ADRESS 0b01000000  //Standardadressendes PCF8574
3
#elif PCF_8574A
4
  #define PCF8574_ADRESS 0b01110000  //Standardadresse des PCF8574A
5
#else
6
  #error "Sie haben keinen oder einen falschen IC in pcf8574.h
7
ausgewaehlt!!\n"
8
#endif

Oben definiere ich
1
#define PCF_8574

oder
1
#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

von Robert S. (razer6)


Lesenswert?

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

von kosmonaut pirx (Gast)


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%C3%A4prozessor#elif

hth

von Detlev (Gast)


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.

von Robert S. (razer6)


Lesenswert?

Danke!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Detlef _. (detlef_a)


Lesenswert?

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

Cheers
Detlef

von inoffizieller WM-Rahul (Gast)


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"...

von Detlef _. (detlef_a)


Lesenswert?

Nee, da würde dann stehen:

#if DEVICE == 0

und da kann ich nix falsches entdecken !?

Cheers
Detlef

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Detlef _. (detlef_a)


Lesenswert?

Danke, wieder was dabeigelernt.

Cheers
Detlef

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.