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 FunktionDamit 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 wiefind_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.