minGW Versions-Makro



  • Hallo,
    ich such mir gerade nen Wolf, aber ich finde einfach kein Macro, welches mir bei minGW die Version ermittelt. Ich brauch die Definition, um zu ermitteln welche Header ich includen muß.
    Für minGW 7.3 brauche ich z.B.

    #include <experimental/filesystem>
    

    und für minGW 8.1

    #include <filesystem>
    

    Ich bräuchte so etwas wie

      #if __MINGW_VERSION > 6
        #include <filesystem>
        namespace fs = std::filesystem;
        #define _HAS_FILESYSTEM
      #elif __MINGW_VERSION > 7
        #include <experimental/filesystem>
        namespace fs = std::experimental::filesystem;
        #define _HAS_FILESYSTEM
      #endif
    
    

    Gruß Helmut



  • In Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.) stehen folgende Makros:

    MinGW (aka MinGW32) and MinGW-w64 32bit: __MINGW32_MAJOR_VERSION and __MINGW32_MINOR_VERSION
    MinGW-w64 64bit: __MINGW64_VERSION_MAJOR and __MINGW64_VERSION_MINOR
    

    Du warst mit __MINGW_VERSION aber nah dran. 😉



  • @Helmut-Jakoby sagte in minGW Versions-Makro:

    Für minGW 7.3 brauche ich z.B.

    #include <experimental/filesystem>
    

    und für minGW 8.1

    #include <filesystem>
    

    Wenn du keine speziell MinGW-spezifischen Eigenheiten umschiffen willst, dann würde ich hier eher empfehlen, auf die GCC-Version zu prüfen (z.B. __GNUC__ >= 7 / >= 8) oder sogar noch präziser, auf die C++-Standardbibliothek libstdc++ zu der diese filesystem-Header gehören:

    _GLIBCXX_RELEASE The major release number for libstdc++. This macro is defined to the GCC major version that the libstdc++ headers belong to (aus Doku).

    Das hat unter anderem den Vorteil, dass diese Makros etwas portabler werden und nicht nur für Windows/MinGW-Zielplattformen funktionieren. Auch wenn du nicht vorhast, für andere Plattformen zu entwickeln, ist das nicht wirklich aufwändiger und besserer Stil IMHO.



  • Danke Th69,
    das habe ich auch schon ausprobiert, aber diese Macros sind in minGW 7.3 und 8.1 in der Datei "_mingw_mac.h" jeweils im Verzeichnis "mingw730_32\i686-w64-mingw32\include" bzw. "mingw810_32\i686-w64-mingw32\include" gleich definiert, bei mir…

    #define __MINGW64_VERSION_MAJOR 6
    #define __MINGW64_VERSION_MINOR 0
    #define __MINGW64_VERSION_BUGFIX 0
    

    und

    #define __MINGW32_MAJOR_VERSION 3
    #define __MINGW32_MINOR_VERSION 11
    

    "gcc –-version" gibt die jeweils richtige Versionsnummer wieder; ich bin nach wie vor ratlos, oder mach ich was falsch?
    Dennoch Danke!



  • Hi Finnegan,
    danke für den Hinweis, werde ich heute Nachmittag ausprobieren, Melde mich dann nochmals.



  • @Helmut-Jakoby sagte in minGW Versions-Makro:

    "gcc –-version" gibt die jeweils richtige Versionsnummer wieder; ich bin nach wie vor ratlos, oder mach ich was falsch?

    Die Version von "MinGW" (C-Standardbibliothek und Windows-Header+Importbibliotheken) korrespondiert nicht mit der GCC-Version. Ich glaube 6 ist da soweit ich weiss ziemlich aktuell. Ich denke der Grund für die Verwirrung ist wohl, dass MinGW meist zusammen mit GCC zum Download angeboten wird und dabei die GCC-Version und eben nicht die MinGW-Version angegeben wird.

    Du willst also wirklich lieber auf die GCC-Version prüfen wie mir scheint. Siehe oben 😉



  • _GLIBCXX_RELEASE tut genau was ich suchte!
    In Datei "c++config.h" einmal mit '7' in "mingw730_32\lib\gcc\i686-w64-mingw32\7.3.0\include\c++\i686-w64-mingw32\bits" und mit '8' in "mingw810_32\lib\gcc\i686-w64-mingw32\8.1.0\include\c++\i686-w64-mingw32\bits".

    Danke an alle!



  • Für den gezeigten Anwendungsfall würde ich empfehlen nicht die Compiler-Version zu testen, sondern "feature detection" zu verwenden. Siehe
    https://gcc.gnu.org/onlinedocs/gcc-10.1.0/cpp/_005f_005fhas_005finclude.html
    https://en.cppreference.com/w/User:D41D8CD98F/feature_testing_macros
    und
    https://en.cppreference.com/w/cpp/preprocessor/include



  • Hi hustbaer,
    danke für den Tip, hat mich echt erhellt!
    Ergebnis:

    # if defined __has_include
    #   if __has_include (<filesystem>)
    #     include <filesystem>
          namespace fs = std::filesystem;
    #     define _HAS_FILESYSTEM
    #   endif
    #   if __has_include (<experimental/filesystem>)
    #     include <experimental/filesystem>
          namespace fs = std::experimental::filesystem;
    #     define _HAS_FILESYSTEM
    #   endif
    # endif
    
    

Anmelden zum Antworten