Home / Guide to predefined macros in C++ compilers (gcc, clang, msvc etc.) edit
When writing portable C++ code you need to write conditional code that depends on compiler used or the OS for which the code is written.
Here’s a typical case:
#if defined (_MSC_VER) // code specific to Visual Studio compiler #endif
To perform those checks you need to check pre-processor macros that various compilers set.
It can eihter be binary is defined vs. is not defined check (e.g. __APPLE__
) or checking a value of the macro (e.g. _MSC_VER
defines version of Visual Studio compiler).
This document describes macros set by various compilers.
Other documentations:
- predefined macros in Visual Studio
- https://sourceforge.net/p/predef/wiki/Compilers/
- to list clang’s pre-defined macros:
clang -x c /dev/null -dM -E
- to list gcc’s pre-defined macros:
gcc -x c /dev/null -dM -E
(not that on mac gcc is actually clang that ships with XCode) - the
-x c /dev/null -dM -E
also works for mingw (which is based on gcc) - listing predefined macros for other compilers
Checking for OS (platform)
To check for which OS the code is compiled:
Linux and Linux-derived __linux__ Android __ANDROID__ (implies __linux__) Linux (non-Android) __linux__ && !__ANDROID__ Darwin (Mac OS X and iOS) __APPLE__ Akaros (http://akaros.org) __ros__ Windows _WIN32 Windows 64 bit _WIN64 (implies _WIN32) NaCL __native_client__ AsmJS __asmjs__ Fuschia __Fuchsia__
Checking the compiler:
To check which compiler is used:
Visual Studio _MSC_VER gcc __GNUC__ clang __clang__ emscripten __EMSCRIPTEN__ (for asm.js and webassembly) MinGW 32 __MINGW32__ MinGW-w64 32bit __MINGW32__ MinGW-w64 64bit __MINGW64__
Checking compiler version
gcc
__GNUC__
(e.g. 5) and __GNUC_MINOR__
(e.g. 1).
To check that this is gcc compiler version 5.1 or greater:
#if defined(__GNUC__) && (__GNUC___ > 5 || (__GNUC__ == 5 && __GNUC_MINOR__ >= 1)) // this is gcc 5.1 or greater #endif
Notice the chack has to be: major > 5 || (major == 5 && minor >= 1)
. If you only do major == 5 && minor >= 1
, it won’t work for version 6.0.
clang
__clang_major__
, __clang_minor__
, __clang_patchlevel__
Visual Studio
_MSC_VER
and _MSC_FULL_VER
:
VS _MSC_VER _MSC_FULL_VER 1 800 3 900 4 1000 4 1020 5 1100 6 1200 6 SP6 1200 12008804 7 1300 13009466 7.1 (2003) 1310 13103077 8 (2005) 1400 140050727 9 (2008) 1500 150021022 9 SP1 1500 150030729 10 (2010) 1600 160030319 10 (2010) SP1 1600 160040219 11 (2012) 1700 170050727 12 (2013) 1800 180021005 14 (2015) 1900 190023026 14 (2015 Update 1) 1900 190023506 14 (2015 Update 2) 1900 190023918 14 (2015 Update 3) 1900 190024210 15 (2017 Update 1 & 2) 1910 191025017 15 (2017 Update 3 & 4) 1911 15 (2017 Update 5) 1912
More information:
- https://blogs.msdn.microsoft.com/vcblog/2016/10/05/visual-c-compiler-version/
- https://blogs.msdn.microsoft.com/vcblog/2017/11/15/side-by-side-minor-version-msvc-toolsets-in-visual-studio-2017/#comment-467525
MinGW
MinGW (aka MinGW32) and MinGW-w64 32bit: __MINGW32_MAJOR_VERSION
and __MINGW32_MINOR_VERSION
MinGW-w64 64bit: __MINGW64_VERSION_MAJOR
and __MINGW64_VERSION_MINOR
Checking processor architecture
gcc
The meaning of those should be self-evident:
__i386__
__x86_64__
__arm__
. If defined, you can further check:__ARM_ARCH_5T__
__ARM_ARCH_7A__
__powerpc64__
__aarch64__
Go to index of articles.
Written on Nov 7 2017. Topics: programming, c++ .
Found a mistake, have a comment? Let me know.