www.mikrocontroller.net

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


Autor: knochenM4RK (Gast)
Datum:

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

Autor: Tom (Gast)
Datum:

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

Aber ich glaub ich hab die Frage falsch verstanden ^^

Grüße

Autor: knochenM4RK (Gast)
Datum:

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

Autor: Mike S. (memme)
Datum:

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

Autor: knochenM4RK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die antworten...
bin jetzt doch etwas schlauer :-)

mfg
Marc

Autor: Tom (Gast)
Datum:

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

Autor: Rolf Magnus (Gast)
Datum:

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

Autor: knochenM4RK (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Danke Danke :-)

Ihr habt mir alle weitergeholfen :-)

mfg

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.