Hatred's Log Place

DON'T PANIC!

May 5, 2012 - 2 minute read - programming c++

Как узнать каким компилятором мы компилируемся?

Не всё делается одинаково во всех компиляторах, не на всех платформах, приходится временами городить хитрые конструкции из #if/#elif/#endif. Случайно наткнулся на шпаргалку, в которой описано, какие директивы препроцессора предопределяют конкретные компиляторы: http://sourceforge.net/p/predef/wiki/Compilers/

С того же ресурса:

А так же определение порядка байтов: http://sourceforge.net/p/predef/wiki/Endianness/

Другие ссылки на эту тематику:

Ниже самое нужное мне, тезисно.

Версии C++ и его библиотек

Макрос __cplusplus:

  • 199711L - C++98
  • 201103L - C++11
  • 201402L - C++14
  • 201703L - C++17
  • 202002L - C++20
  • 202302L - C++23

Можно проверять отдельные фичи (начиная с C++20):

Платформы Windows/Linux/Android

  • Linux:
    • __linux__
  • Windows (TBD: перепроверить`):
    • _WIN16 - скорее всего не встретится, для 16 бит окружения
    • _WIN32 - определено для 32 и для 64 бит окружения
    • _WIN64 - определено для 64 бит окружения
  • Android
    • на нём же определён __linux__
    • __ANDROID__
    • __ANDROID_API__ - значение - API level (<android/api-level.h>)

Архитектура x86/x86_64/arm/aarch64

  • x86_64
    • __amd64__
    • __x86_64__
  • x86
    • GCC/Clang:
      • __i386__
        • и куча вариаций (при этом предыдущий так же будет определён)
          • __i486__
          • __i586__
          • __i686__
    • MinGW:
      • _X86_
    • Visual Studio:
      • _M_I86 - только для 16 бит платформ
      • _M_IX86 - только для 32 бит платформ, при этом это и версия типа V00 (300 - 386, 400 - 486, 500 - 586, 600 - 686)
  • arm64/aarch64
    • __aarch64__, но __arm__ тоже определён
  • arm
    • __arm__
    • __thumb__
    • ещё куча всего связанного с конкретными архитектурами

Компиляторы

  • Clang
    • __clang__ - стоит отметить, что в IDE использующих llvm/clang для парсинга (Qt Creator) этот макрос будет определён в дополнении к макросам реального компилятора.
    • __clang_major__
    • __clang_minor__
    • __clang_patchlevel__
    • __clang_version__
  • GCC
    • __GNUC__ - он же major версии компилятора
    • __GNUC_MINOR__
    • __GNUC_PATCHLEVEL__ - может быть не определён
    • __GNUC_VERSION__ - децимальная версия (__GNUC__ * 10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__)
  • MSVC
    • _MSC_VER - децимальная версия, вида VVRR: VV - Version, RR - Revision
      • наиболее актуальные:
        • 1900 - 14.0 (2015)
        • 1910..1916 - 15.0 (2017)..15.9 (2017)
        • 1920..1929 - 16.0 (2019)..16.11 (2019)
        • 1930..1944 - 17.0 (2022)..17.14 (2022)
    • _MSC_FULL_VER - полная децимальная версия вида
      • VVRRPPPP: VV - Version, RR - Revision, PPPP - Patch, начиная с Visual C++ 6.0 Processor pack
      • VVRRPPPPP: VV - Version, RR - Revision, PPPPP - Patch, начиная с Visual C++ 8.0 (больше цифр для Patch)
    • Детально тут: Microsoft C++ (MSVC) compiler versioning
  • MinGW
    • __MINGW32__
    • __MINGW64__

Big/Little Endianness

  • BE
    • __BIG_ENDIAN__
    • __BYTE_ORDER__ = __BIG_ENDIAN__
    • __FLOAT_WORD_ORDER__ == __BIG_ENDIAN__
  • LE
    • __LITTLE_ENDIAN__
    • __BYTE_ORDER__ = __LITTLE_ENDIAN__
    • __FLOAT_WORD_ORDER__ = __LITTLE_ENDIAN__

На C++20 в compile-time можно проверять через std::endian.

Tags:c c++ crossdev programming

C++ Cheat Sheets Test

comments powered by Disqus