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


von Christian B. (christianbesemann)


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

von Grrrr (Gast)


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.

von Chris (Gast)


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

von Mark B. (markbrandis)


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?

von Chris (Gast)


Lesenswert?

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

von Laszlo H. (mobius)


Lesenswert?

indem du #if verwendest
1
#if defined(A) || defined(B)
2
...
3
#endif

gruß
Mobius

edit: okay, DAS nenn ich gleichzeitig :D

von donald (Gast)


Lesenswert?

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

von Christian B. (christianbesemann)


Lesenswert?

Super, es funzt!!!!

Danke Euch, tolle Leute!

Grüße Chris

von Rolf Magnus (Gast)


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.

von (prx) A. K. (prx)


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.

von Yalu X. (yalu) (Moderator)


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>

von (prx) A. K. (prx)


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.

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.