In #define weitere direktiven Benutzen?
-
Hi.
Ist es möglich, es irgendwie hinzubekommen, in #define weitere Präprozessordirektiven zu benutzen?
So funktioniert das leider nicht:#define BLA(x, y) \ #ifdef BLUBB \ x \ #else \ y \ #endif
EDIT: Ich habe meinen DUMMEN Fehler selbst bemerkt. Dankeschön trotzdem
Danke und Gruß!
-
Dann sag für die Nachwelt am besten auch, was daran falsch ist (z.B., dass es keinen Sinn macht, ein Makro mit #ifdef usw. zu definieren, da der Compiler solche Anweisungen gar nicht kennt und es nur Fehlermeldungen hageln würde).
-
Und um die ursprüngliche Frage zu beantworten: Nein, es ist nicht möglich, in Makrodefinitionen andere Präprozessordirektiven zu verwenden, die dann auch ausgewertet werden.
-
Umdrehen könnte mans aber:
#ifdef BLUBB #define BLA(x, y) x #else #define BLA(x, y) y #endif
Man könnte (und sollte) es natürlich auch mit etwas weniger Präprozessormagie machen:
#ifdef BLUBB template <class X, class Y> inline X& BLA(X& x, Y& /*y*/) { return x; } #else template <class X, class Y> inline Y& BLA(X& /*x*/, Y& y) { return y; } #endif
-
@pumuckl Hier ist dies nicht unbedingt besser. Damit die inline Version zuverlässig funktioniert muss die Definition in jeder Übersetzungseinheit gleich sein (Stichwort: ODR). BLUBB muss also überall gleich definiert sein. Die Makroversion darf aber abweichen und kann sogar innerhalb einer Übersetzungseinheit umdefiniert werden. Es hängt also davon ab was du machen willst, ob die inline-Variante wirklich besser ist.
-
Hi.
Ich habs jetzt so gelöst wie pumuckl es geschrieben hat.Gruß und Danke
-
theliquidwave schrieb:
Hi.
Ich habs jetzt so gelöst wie pumuckl es geschrieben hat.Gruß und Danke
Die Makro- oder die Inline-Version?
-
Ben04 schrieb:
@pumuckl Hier ist dies nicht unbedingt besser. Damit die inline Version zuverlässig funktioniert muss die Definition in jeder Übersetzungseinheit gleich sein (Stichwort: ODR). BLUBB muss also überall gleich definiert sein. Die Makroversion darf aber abweichen und kann sogar innerhalb einer Übersetzungseinheit umdefiniert werden. Es hängt also davon ab was du machen willst, ob die inline-Variante wirklich besser ist.
Das Problem hat man so oder so, wenn man BLA in einem Header benutzt. Der selbe Header hätte auch mit der Makro-Version von BLA verschiedene Bedeutungen in verschiedenen ÜEs, und ist ist in beiden Fällen (Makro oder inline-version) unkritisch, wenn man es nur in einer .cpp benutzt.