Compiler abhängigkeiten - static_assert



  • Hallo,

    ich würde gerne das static_assert nutzen und habe mir eben mit templates was zusammengebaut für den Fall das der Compiler das kein static_assert kann.

    Kann ich irgendwie prüfen, ob der compiler ein static_assert kann oder nicht ??
    Gibt es eine präprozessor direktive, welche jeder compiler nutzen muss, um seine
    C++ verion (standard) mitzuteilen ??



  • AlexanderKiebler schrieb:

    Hallo,

    ich würde gerne das static_assert nutzen und habe mir eben mit templates was zusammengebaut für den Fall das der Compiler das kein static_assert kann.

    Kann ich irgendwie prüfen, ob der compiler ein static_assert kann oder nicht ??
    Gibt es eine präprozessor direktive, welche jeder compiler nutzen muss, um seine
    C++ verion (standard) mitzuteilen ??

    Kannst du Boost verwenden? Wenn ja, es gibt Boost.StaticAssert, das macht genau was du willst.



  • pyhax schrieb:

    AlexanderKiebler schrieb:

    Hallo,

    ich würde gerne das static_assert nutzen und habe mir eben mit templates was zusammengebaut für den Fall das der Compiler das kein static_assert kann.

    Kann ich irgendwie prüfen, ob der compiler ein static_assert kann oder nicht ??
    Gibt es eine präprozessor direktive, welche jeder compiler nutzen muss, um seine
    C++ verion (standard) mitzuteilen ??

    Kannst du Boost verwenden? Wenn ja, es gibt Boost.StaticAssert, das macht genau was du willst.

    Das beantwortet nicht seine Frage.

    Du könntest das __cplusplus Makro prüfen:

    __cplusplus > 199711L
    


  • Okay, danke für die Antwroten.

    An der Stelle mag ich kein boost verwenden.
    (Ev.zu Unrecht.. aber das muss ich mir dann erst anschauen)

    Das "__cplusplus > 199711L" hat mich deshalb erstmal weiter gebracht.

    Thanks



  • Das dürfte allerdings nicht 100% sicher sein, schätze ich.
    Ein Compiler könnte im C++11 Modus laufen (mit z.B. lambda's, variadic templates usw.), aber leider trotzdem kein static_assert unterstützen, weil es eben noch nicht implementiert wurde (warum auch immer).
    In dem Fall könnte das __cplusplus Makro zwar den erforderlichen Wert haben, static_assert müsste aber trotzdem emuliert werden.

    Zwar unwahrscheinlich, aber nicht unmöglich 😉



  • DrakoXP schrieb:

    Das dürfte allerdings nicht 100% sicher sein, schätze ich.
    Ein Compiler könnte im C++11 Modus laufen (mit z.B. lambda's, variadic templates usw.), aber leider trotzdem kein static_assert unterstützen, weil es eben noch nicht implementiert wurde (warum auch immer).
    In dem Fall könnte das __cplusplus Makro zwar den erforderlichen Wert haben, static_assert müsste aber trotzdem emuliert werden.

    Zwar unwahrscheinlich, aber nicht unmöglich 😉

    Nope. Du hast Recht, genau das wollte ich auch schreiben. Aber eine andere "Wahl" hat er nicht, außer er hört auf so einen allgemein gültigen Code zu schreiben.



  • Sone schrieb:

    Nope. Du hast Recht, genau das wollte ich auch schreiben. Aber eine andere "Wahl" hat er nicht, außer er hört auf so einen allgemein gültigen Code zu schreiben.

    So ganz stimmt das nicht das er keine andere "Wahl" hätte. Das Feature ist glaube ich nur bei clang implementiert.
    Und zwar feature detection macros http://clang.llvm.org/docs/LanguageExtensions.html#feature_check



  • Boost.Config ist ja relativ klein, aber nützlich:

    #include <boost/config.hpp>
    #if defined(BOOST_NO_STATIC_ASSERT)
      // meh. Workaround...
    #endif
    


  • da kann er sich gleich Boost.StaticAssert holen. Da ist sein workaround sogar bereits implementiert.


Anmelden zum Antworten