www.mikrocontroller.net

Forum: Compiler & IDEs Logische Verknüpfung von Präprozessoranweisungen


Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte Präprozessoranweisungen logisch verknüpfen, so in etwa:

#ifdef A || ifdef B
machwas
#endif
...

so funktioniert es aber leider nicht, kann jemand sagen ob das logische 
Verknüpfen von Präprozessoranweisungen überhaupt funktioniert, wenn ja 
wie dann?

Dank Euch, Chris

Autor: Grrrr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christian Besemann schrieb:
> ob das logische
> Verknüpfen von Präprozessoranweisungen überhaupt funktioniert

Nein.

Es ist aber möglich in der Bedingung von "#if" logische Verknüpfungen zu 
verwenden.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leicht, hier die portable version

#ifdef A
#define A_OR_B 1
#endif

#ifdef B
#undef A_OR_B
#define A_OR_B 1
#endif

#ifdeb A_OR_B
machwas
#endif

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich versuche gerade den Sinn einer OR-Verknüpfung dieser Art zu 
verstehen. Wenn A und B z.B. durch Compiler-Defines zustande kommen, 
wozu dann zwei verschiedene Defines für den gleichen auszuführenden 
Code?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
gcc da müsste auch folgendes funktionieren
#if defined(A) || defined(B)
...
#endif

Autor: Laszlo H. (mobius)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
indem du #if verwendest
#if defined(A) || defined(B)
...
#endif

gruß
Mobius

edit: okay, DAS nenn ich gleichzeitig :D

Autor: donald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es eigentlich irgend einen Grund, warum der C-Präprozessor so 
eingeschränkt ist? Schleifen sind ja beispielsweise auch nicht möglich.

Autor: Christian Besemann (christianbesemann)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super, es funzt!!!!

Danke Euch, tolle Leute!

Grüße Chris

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:
> Ich versuche gerade den Sinn einer OR-Verknüpfung dieser Art zu
> verstehen. Wenn A und B z.B. durch Compiler-Defines zustande kommen,
> wozu dann zwei verschiedene Defines für den gleichen auszuführenden
> Code?

Stell dir einfach vor, du hast zwei Features deines Programms, die du 
durch bedingte Compilierung aktivieren können möchtest. Da kann es doch 
gut sein, daß es auch Codestellen gibt, die nur dann benötigt werden, 
wenn wenigstens eins der beiden aktiviert sind.

donald schrieb:
> Gibt es eigentlich irgend einen Grund, warum der C-Präprozessor so
> eingeschränkt ist? Schleifen sind ja beispielsweise auch nicht möglich.

Es wurde wohl nie als wichtig genug erachtet. Wenn du 
Compilezeit-Schleifen willst, mußt du C++ und template-Metaprogramming 
verwenden. Ok, sind eigentlich auch keine Schleifen, sondern Rekursion, 
aber zumindest geht sowas da.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
donald schrieb:

> Gibt es eigentlich irgend einen Grund, warum der C-Präprozessor so
> eingeschränkt ist? Schleifen sind ja beispielsweise auch nicht möglich.

Der Erfinder hielt mehr eben nicht für erforderlich.

Wer mehr wollte konnte schon bald auf den Präprozessor M4 ausweichen.

Autor: Yalu X. (yalu) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
donald schrieb:
> Gibt es eigentlich irgend einen Grund, warum der C-Präprozessor so
> eingeschränkt ist? Schleifen sind ja beispielsweise auch nicht möglich.

<offtopic>
... aber die ursprüngliche Frage ist ja schon beantwortet worden ;-)

Ich finde es immer wieder interessant, wie einfach, elegant und mächtig
die Makrogeschichte in Lisp gelöst ist: Dort gibt es im Gegensatz zu C
keine spezielle Präprozessorsprache. Als Präprozessorsprache wird
einfach Lisp selber genommen. Dies erlaubt es dem Programmierer, nahezu
beliebige Spracherweiterungen, komplexe Codegeneratoren u.v.m. zu
entwickeln, ohne dass er dazu eine spezielle Makrosprache erlernen muss.
</offtopic>

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interpreter wie Lisp und Forth haben es da etwas leichter. Sowas lässt 
sich nicht so leicht auf Crosscompiler übertragen, denn das würde eine 
Melange aus 2 Compilern voraussetzen, einen für das Hostsystem und einen 
für das Zielsystem.

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.