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).


  • Mod

    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.


Anmelden zum Antworten