Globale Compile Option: Makro oder Template?


  • Administrator

    Grüsse zusammen,

    Jeder wird dies sicher kennen, wenn man etwas in einer Bibliothek auf unterschiedliche Arten kompilieren kann. TinyXML ist da so ein Fall, mit dem TIXML_USE_STL :

    #define TIXML_USE_STL
    #include "tinyxml.h"
    
    // Irgendwo in TinyXML stehen dann wohl Dinge wie:
    #ifdef TIXML_USE_STL
    // ...
    #else
    // ...
    #endif
    

    Ich habe mich gerade gefragt, ob man dies nicht anders erledigen könnte, nämlich ohne Makros. Zumindest für einen gewissen Teil mag dies stimmen und ich würde den mal hier hinsetzen:

    template<bool VALUE>
    struct OptionXYZ
    {
      static bool const isActive = false;
    };
    
    // Wenn nun jemand diese Option verwenden möchte, muss er definieren:
    template<>
    struct OptionXYZ<true>
    {
      static bool const isActive = true;
    };
    
    // Im Code der Bibliothek stehen dann Dinge wie:
    if(OptionXYZ<true>::isActive)
    {
      // ...
    }
    else
    {
      // ...
    }
    

    Der Compiler sollte wohl klug genug sein, eine if-Anweisung wegzuoptimieren, wenn die Bedingung immer false ist. Also erreicht man grundsätzlich das gleiche, wie bei den Makros.

    Aber ist das nun eine zu grosse Abscheu vor Makros oder ist das wirklich sinnvoll so einzusetzen? Sicher, die Templates bieten hier keinen vollständigen Ersatz, man kann nicht Funktionen anders benennen oder ähnliches, aber in Funktionen drin, kann man Dinge anders ausführen lassen oder gar andere Typen verwenden (Stichwort: Boost.MPL).

    Ich bin gespannt auf eure Meinungen.

    Grüssli



  • Dravere schrieb:

    Ich habe mich gerade gefragt, ob man dies nicht anders erledigen könnte, nämlich ohne Makros. Zumindest für einen gewissen Teil mag dies stimmen und ich würde den mal hier hinsetzen:
    ...
    Aber ist das nun eine zu grosse Abscheu vor Makros oder ist das wirklich sinnvoll so einzusetzen?

    Ich würde sagen es liegt einmal daran das man nur mit Makros bestimmte Header ausschließen kann (manchmal wichtig) und vielleicht weil es "üblich" ist. Gegen die Templateversion kann - muss aber nicht - auch noch die zusätzliche Compilezeit sprechen (wobei ich grundsätzlich auch Templates bzw. direkte Sprachmittel den Makros vorziehe).

    cu André



  • Ein Grund dürfte sicherlich sein, dass viele Defines vom Compiler oder per Kommandozeilenoption aus Build-Umgebungen heraus gesetzt werden.



  • ich denke es verfehlt auch die Kritik an Makros. Dumme Textersetzung ist bedingte Kompilierung ja nicht.


Anmelden zum Antworten