Nach Boost und C++11 prüfen



  • Ich weiß nicht genau ob das Thema in C++ oder Compiler besser passt. Ich schreibe eine kleine Project mit dem man auf jedem System( windows, linux und MacOS ) leicht Hardwareinformationen auslesen kann.

    Ich habe mir dabei gedanken gemacht wie ich die Funktionen schreibe:

    WENN(c++11) { }
    WENN(boost) { }
    C API oder eigene Funktion

    Damit das Projekt mit jedem Compiler funktioniert und wenn mann nur eine Funktion braucht nicht gleich boost einbinden muss.

    Meine Frage ist ob das so auch funktioniert:

    #ifndef SYSINFO_DEFINES_H
    #define SYSINFO_DEFINES_H
    
    #include <boost/version.hpp>
    
    #if __cplusplus > 199711L   //c++11
        #define CPP11 1
    #endif  //  __cplusplus > 199711L
    
    #ifdef BOOST_VERSION
        #define BOOST_SUPPORTED 1
    #endif //BOOST_VERSION
    
    #ifdef BOOST_SUPPORTED
    
        namespace boostVersion
        {
            static const unsigned major = BOOST_VERSION / 100000;
            static const unsigned minior = BOOST_VERSION / 100 % 1000;
            static const unsigned patch = BOOST_VERSION % 100;
        }
    
    #endif //BOOST_SUPPORTED
    
    #endif // SYSINFO_DEFINES_H
    

    PS: ist einfach nur ein hobby Projekt um lernen.



  • Für C++11 gibt es kein zuverlässiges Makro, zumal es sich nicht um einen binären Entscheid handelt -- viele Compiler unterstützen C++11 zu einem Teil. Du musst daher explizit auf die Compilerversionen prüfen, abhängig von den benutzten Sprach- und Bibliotheksfeatures. Oder du benutzt dazu Boost.Config.



  • Include ist include: wenn die Datei nicht vorhanden ist, gibt es einen Fehler. Dein Boosttest funktioniert nicht.



  • Include ist include: wenn die Datei nicht vorhanden ist, gibt es einen Fehler. Dein Boosttest funktioniert nicht.

    Genau das ist mein Problem gibt es überhaupt eine möglichkeit mit C++ nur libs einzubinden wenn sie vorhanden sind ?



  • sysinfo schrieb:

    Genau das ist mein Problem gibt es überhaupt eine möglichkeit mit C++ nur libs einzubinden wenn sie vorhanden sind ?

    So allgemein nicht. Was heisst "vorhanden"? Irgendwo auf dem Computer des Benutzers? Compiler kennt den Include-Pfad?

    Ich würde hier nicht zu viele implizite Features einbauen. Lass den Entwickler entsprechend konfigurieren, z.B. durch das Setzen eines Makros. Mit CMake hast durch Find-Module du mehr Möglichkeiten, andere Bibliotheken zu erkennen.



  • sysinfo schrieb:

    Include ist include: wenn die Datei nicht vorhanden ist, gibt es einen Fehler. Dein Boosttest funktioniert nicht.

    Genau das ist mein Problem gibt es überhaupt eine möglichkeit mit C++ nur libs einzubinden wenn sie vorhanden sind ?

    Nein! Deswegen haben ja viele Opensourceprojekte configure Scripte.



  • Mach separate Header für Dinge, die Boost voraussetzen. Der Benutzer weiß am besten, ob er die einbinden kann.
    EDIT: Wenn du dein Programm kompilierst, benutze etwas fertiges wie find_package(Boost) in CMake.

    Für die Verfügbarkeit mancher C++-Features gibt es Makros in Boost.

    Man kann auch selber die relevanten Compiler-Makros auswerten, um die benötigten Feature-Makros zu definieren. Mit __GNUC__ , __GNUC_MINOR__ und _MSC_VER kommt man schon recht weit.



  • sysinfo schrieb:

    WENN(c++11) { }
    WENN(boost) { }

    Was passiert denn wenn nicht? Entweder du machst WENN(c++11){}SONST{}, dann brauchst du auf jeden Fall einen SONST-Block der auch ohne c++11 funktioniert und damit ist der WENN(c++11)-Block überflüssig, oder du machst sowas wie WENN(c++11){}SONST{error: geht nicht}. Dann brauchst du auch keine Unterscheidung, dann nimmst du einfach c++11 und der Compiler schluckt es oder sagt von sich aus dass es nicht geht.


Log in to reply