#Ifdef ....

Gast #332484
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
Gast #332485
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
Gast #332486
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
#332487
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 :-)
Gast #332489
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
Gast #332490
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.