Forum: Mikrocontroller und Digitale Elektronik #Ifdef ....


von knochenM4RK (Gast)


Lesenswert?

moin moin...
ich hätte da mal wieder ein kleines Problem. Diesmal ist es ein kleines
Problem mit der C-Programmierung.
Und zwar bei dem Befehl #ifdef xx wird ja nachfolgende Programmteil nur
bearbeitet wenn xx definiert ist. Diese Bearbeitung schieht ja zur
Kompiliererzeit!! Jetzt wollte ich "xx" noch etwas "erweitern", dh
zb "#ifdef (xx && yy || zz)" (yy, zz wird logischerweise dann auch
definiert).
Jetzt weiß ich allerdings nicht ob das C überhaupt zulässt oder das
immer währed der Laufzeit (per normale if-abfrage) bearbeitet wird.

ich hoffe das ich verständlich ausgedrückt habe.

danke schon mal vorraus :-)

mfg
Marc

von Tom (Gast)


Lesenswert?

Hi Marc,

"
Und zwar bei dem Befehl #ifdef xx wird ja nachfolgende Programmteil nur
bearbeitet wenn xx definiert ist."
soweit ich das verstanden hab wird der nachfolgende Programmteil nur
KOMPILIERT wenn xx def ist...

"
ifdef

Mit der ifdef-Direktive kann geprüft werden, ob ein Symbol definiert
wurde. Falls nicht, wird der Code nach der Direktive nicht an den
Compiler weitergegeben. Eine ifdef-Direktive muss durch eine
endif-Direktive abgeschlossen werden.
"

http://de.wikibooks.org/wiki/C-Programmierung:_Pr%C3%A4prozessor

Aber ich glaub ich hab die Frage falsch verstanden ^^

Grüße

von knochenM4RK (Gast)


Lesenswert?

moin Tom

hast es ein wenig falsch verstanden...

ich wollte eigentlich nur wissen ob der Präprozessor #ifdef noch
funktioniert wenn ich dem mehrere Symbole (zb &&-verknüpft) zum
überprüfen übergebe.

mfg
Marc

von Mike S. (memme)


Lesenswert?

>Und zwar bei dem Befehl #ifdef xx wird ja nachfolgende Programmteil
>nur bearbeitet wenn xx definiert ist. Diese Bearbeitung schieht ja
zur
>Kompiliererzeit!

Naja, bearbeiten ist nicht so ganz richtig. Der Programmteil wird vom
Präprozessor nur in die zu bearbeitente Datei eingefügt. Der Compiler
selber sieht von dem #ifdef gar nichts mehr.


>Jetzt wollte ich "xx" noch etwas "erweitern", dh
>zb "#ifdef (xx && yy || zz)" (yy, zz wird logischerweise dann auch
>definiert).
>Jetzt weiß ich allerdings nicht ob das C überhaupt zulässt oder das
>immer währed der Laufzeit (per normale if-abfrage) bearbeitet wird.

Wie wäre es mit ausprobieren?
Zur Laufzeit kann das nicht mehr bearbeitet werden, da die #
Anweisungen wie gesagt schon vor dem kompilieren verarbeitet werden.

Wen nich das Ganze bei mir teste, klappt es übrigens nicht. Der
Präprozessor kann wohl nur einfache logik, aber evtl. kannst du das von
dir gewünschte aus mehreren Schirtten zusammenbauen. Mußt du mal selber
probieren.

Besonders gut ist übrigens der CodeWarrior in solchen Dingen, da kann
man sich ansehen, was der Präprozessor aus einer Datei macht :-)

von knochenM4RK (Gast)


Lesenswert?

Danke für die antworten...
bin jetzt doch etwas schlauer :-)

mfg
Marc

von Tom (Gast)


Lesenswert?

Mit ifdef überprüfst du nur ob ein Symbol definiert wurde...probiers mal
mit:

"
Mit #if kann ähnlich wie mit #ifdef eine bedingte Übersetzung
eingeleitet werden, jedoch können hier konstante Ausdrücke ausgewertet
werden.

Beispiel:

#if (DEBUGLEVEL >= 1)
#  define print1 printf
#else
#  define print1(...) (0)
#endif

#if (DEBUGLEVEL >= 2)
#  define print2 printf
#else
#  define print2(...) (0)
#endif

Hier wird abhängig vom Wert der Präprozessorkonstante DEBUGLEVEL
definiert, was beim Aufruf von print2() oder print1() passiert.

Der Präprozessorausdruck innerhalb der Bedingung folgt den gleichen
Regeln wie Ausdrücke in C, jedoch muss das Ergebnis zum
Übersetzungszeitpunkt bekannt sein.
"

Grüße

von Rolf Magnus (Gast)


Lesenswert?

> Diese Bearbeitung schieht ja zur Kompiliererzeit!!

Ja, es ist eine Präprozessoranweisung. Aber das ist kein Grund, zu
schreien.

> Jetzt wollte ich "xx" noch etwas "erweitern", dh zb "#ifdef (xx
&&
> yy || zz)" (yy, zz wird logischerweise dann auch definiert).

Das geht so natürlich nicht. #ifdef prüft, ob das, was dahinter ist,
als Naeme im Präprozessor definiert wurde (mit #define).
(xx && yy || zz) ist aber natürlich kein Name. Du kannst aber #if
nehmen. Das nimmt die Werte, also:

#if xx && yy || zz

> Jetzt weiß ich allerdings nicht ob das C überhaupt zulässt oder
> das immer währed der Laufzeit (per normale if-abfrage) bearbeitet
> wird.

Mit #if wird's zur Compilezeit ausgewertet, wie mit allen
Präprozessor-Direktiven.

von knochenM4RK (Gast)


Lesenswert?

Danke Danke Danke :-)

Ihr habt mir alle weitergeholfen :-)

mfg

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.