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
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.
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
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?
gcc da müsste auch folgendes funktionieren #if defined(A) || defined(B) ... #endif
indem du #if verwendest
1 | #if defined(A) || defined(B)
|
2 | ...
|
3 | #endif
|
gruß Mobius edit: okay, DAS nenn ich gleichzeitig :D
Gibt es eigentlich irgend einen Grund, warum der C-Präprozessor so eingeschränkt ist? Schleifen sind ja beispielsweise auch nicht möglich.
Super, es funzt!!!! Danke Euch, tolle Leute! Grüße Chris
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.
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.
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>
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.