The compiler supports the predefined macros listed in the table below. The compiler also includes predefined macros specified by the ISO/ANSI standard.
Unless otherwise stated, the macros are supported on systems based on IA-32 and Intel® 64 architectures. IA-32 is not available on macOS*.
The Intel® C++ Compiler defines the same target-architecture macros that GCC does. For -m feature, GCC defines __FEATURE__.
You can target specific processor architectures by using the -x, -m, and -march compiler options. Each of these options enables feature-specific macros in the compiler. These macros are used to guard a section of application code that uses target-specific feature. The following command emits the list of predefined macros enabled by targeting a specific processor architecture:
icpc -dM -E helloworld.cc -xarch
For example, you could do the following to determine which feature macros would help identify whether this is ICELAKE-SERVER:
icpc -dM -E helloworld.cc -xSKYLAKE-AVX512 > avx512.txt 2>&1 icpc -dM -E helloworld.cc -xICELAKE-SERVER > icelake.txt 2>&1 diff avx512.txt icelake.txt 317a318 > #define AVX512IFMA 1 320a322,329 > #define AVX512VBMI 1 > #define AVX512VPOPCNTDQ 1 > #define AVX512BITALG 1 > #define AVX512VBMI2 1 > #define GFNI 1 > #define VAES 1 > #define VPCLMUL 1 > #define AVX512VNNI 1 321a331,334 > #define RDPID 1 > #define SGX 1 > #define WBNOINVD 1 > #define PCONFIG 1
The result of the diff command is the list of feature macros that can be used to differentiate icelake-server from skylake-avx512.
| Macro | Description | 
|---|---|
| __APPLE__ (macOS*) | Defined as '1'. | 
| __APPLE_CC__ (macOS*) | The gcc* build number | 
| __ARRAY_OPERATORS (Linux*) | Defined as '1'. | 
| __AVX__ (Windows*, Linux, macOS*) | On Windows*, defined as '1' when option /arch:AVX, /QxAVX, or higher processor targeting options are specified. On Linux*, defined as '1' when option -march=corei7-avx, -mavx, -xAVX, or higher processor targeting options are specified. NoteAvailable only for compilations targeting Intel® 64 architecture. | 
| __AVX2__ (Windows, Linux, macOS*) | On Windows, defined as '1' when option /arch:CORE-AVX2, /QxCORE-AVX2, or higher processor targeting options are specified. On Linux, defined as '1' when option -march=core-avx2, -xCORE-AVX2, or higher processor targeting options are specified. NoteAvailable only for compilations targeting Intel® 64 architecture. | 
| __AVX512BW__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Byte and Word instructions. It is also defined as '1' when option [Q]xCORE-AVX512 or higher processor-targeting options are specified. | 
| __AVX512CD__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Conflict Detection instructions. It is also defined as '1' when option [Q]xCORE-AVX512, [Q]xCOMMON-AVX512, or higher processor-targeting options are specified. | 
| __AVX512DQ__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Doubleword and Quadword instructions. It is also defined as '1' when option [Q]xCORE-AVX512 or higher processor-targeting options are specified. | 
| __AVX512ER__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Exponential and Reciprocal instructions. | 
| __AVX512F__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Foundation instructions. It is also defined as '1' when option [Q]xCORE-AVX512, [Q]xCOMMON-AVX512, or higher processor-targeting options are specified. | 
| __AVX512PF__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Prefetch instructions. | 
| __AVX512VL__ (Windows*, Linux, macOS*) | Defined as '1' for processors that support Intel® Advanced Vector Extensions 512 (Intel® AVX-512) Vector Length extensions. It is also defined as '1' when option [Q]xCORE-AVX512 or higher processor-targeting options are specified. | 
| __BASE_FILE__ (Linux) | Name of source file | 
| _BOOL (Linux) | Defined as '1'. | 
| __COUNTER__ (Windows) | Defined as '0'. | 
| __cplusplus (Linux) | Defined as '1' (for the Intel® C++ Compiler). | 
| __DEPRECATED (Linux) | Defined as '1'. | 
| __DYNAMIC__ (macOS*) | Defined as '1'. | 
| __EDG__ (Windows, Linux, macOS*) | Defined as '1'. | 
| __EDG_VERSION__ (Windows, Linux, macOS*) | EDG version | 
| __ELF__ (Linux) | Defined as '1' at the start of compilation. | 
| __EXCEPTIONS (Linux) | Defined as '1' when option fno-exceptions is not used. | 
| __gnu_linux__ (Linux) | Defined as '1' at the start of compilation. | 
| __GNUC__ (Linux) | The major version number of gcc* installed on the system or explicitly specified via –gcc-name/ –gxx-name. | 
| __GNUC_MINOR__ (Linux) | The minor version number of gcc* or g++* installed on the system or explicitly specified via –gcc-name/ –gxx-name. | 
| __GNUC_PATCHLEVEL__ (Linux) | The patch level version number of gcc* or g++* installed on the system or explicitly specified via –gcc-name/ –gxx-name. | 
| __GNUG__ (Linux) | The major version number of g++* installed on the system or explicitly specified via –gcc-name/ –gxx-name. | 
| __GXX_ABI_VERSION (Linux) | The value of this is dependent on the -fabi-version option in effect. 102: -fabi-version=1 || gcc version < 3.4 1008: gcc version >= 5.0 999999: -fabi-version=0 100? Where ? matches the -fabi-version passed: -fabi-version=2,3,4,5,6,7,8,9 1002: Gcc version > 3.5 and < 5.0 | 
| __HONOR_STD (Linux, macOS*) | Defined as '1'. | 
| __i386__ __i386 i386 (Linux, macOS*) | Defined as '1' for compilations targeting IA-32 architecture. IA-32 is not available on macOS*. | 
| __ICC (Linux, macOS*) | The version of the compiler. NoteThis macro may be affected by compiler options, such as -no-icc. | 
| __ICL (Windows) | The version of the compiler. NoteThis macro may be affected by compiler options, such as /Qicl-. | 
| _INC_STDIO (Windows) | Defined, no value. | 
| _INTEGRAL_MAX_BITS (Windows) | 64 | 
| __INTEL_COMPILER (Windows*, Linux, macOS*) | The version of the compiler. NoteThis macro may be affected by compiler options, such as -no-icc. | 
| __INTEL_COMPILER_BUILD_DATE (Windows*, Linux, macOS*) | The compiler build date. It takes the form YYYYMMDD, where YYYY is the year, MM is the month, and DD is the day. | 
| __INTEL_COMPILER_UPDATE (Windows, Linux, macOS*) | Returns the current minor update number of the compiler, starting at 0. You can use this macro to differentiate between compiler updates when you have multiple updates of the Intel® C++ Compiler installed concurrently. Example: For Intel® C++ Compiler version XX.0.2, the macro would preprocess to "2". | 
| __INTEL_CXX11_MODE__ (Windows, Linux) | Enables C++11 experimental support for C++ programs. Defined as '1' when option [Q]std=c++11 is specified. | 
| __INTEL_MS_COMPAT_LEVEL (Windows) | Defined as '1'. Equal to the same value n as specified by option [Q]msn. | 
| __INTEL_RTTI__ (Linux, macOS*) | Defined as '1' when option -fno-rtti is not specified. | 
| __INTEL_STRICT_ANSI__ (Linux, macOS*) | Defined as '1' when option -strict-ansi is specified. | 
| __linux__ __linux linux (Linux) | Defined as '1' at the start of compilation. | 
| __LITTLE_ENDIAN__ (macOS*) | Defined as '1'. | 
| __LONG_DOUBLE_SIZE__ (Windows*, Linux, macOS*) | On Linux and macOS*, defined as 80. On Windows, defined as 64; defined as 80 when option /Qlong-double is specified. | 
| __LONG_DOUBLE_64__ (Linux) | When this macro is defined, the long double type is 64-bits. It is defined when you specify option -mlong-double-64. | 
| __LONG_MAX__ (Linux) | 9223372036854775807L NoteAvailable only for compilations targeting Intel® 64 architecture. | 
| __LP64__ (Linux) __LP64 (Linux) | Defined as '1'. NoteAvailable only for compilations targeting Intel® 64 architecture. | 
| _M_AMD64 (Windows) | Defined as '1' while building code targeting Intel® 64 architecture. | 
| _M_IX86 (Windows) | 700 | 
| _M_X64 (Windows) | Defined as '1' while building code targeting Intel® 64 architecture. | 
| __MACH__ (macOS*) | Defined as '1'. | 
| __MMX__ (Linux, macOS*) | Defined as '1'. On Linux, it is available only on systems based on Intel® 64 architecture. | 
| _MSC_EXTENSIONS (Windows) | Defined as '1'. This macro is defined when Microsoft extensions are enabled. | 
| _MSC_FULL_VER (Windows) | The Visual C++* version being used. 190022609 for Visual C++* 2015 1800210051 for Visual C++* 2013 | 
| _MSC_VER (Windows) | The Visual C++* version being used. 1900 for Visual C++* 2015 1800 for Visual C++* 2013 | 
| _MT (Windows) | On Windows, defined as '1' when a multithreaded DLL or library is used (when option /MD[d] or /MT[d] is specified). | 
| __NO_INLINE__ __NO_MATH_INLINES __NO_STRING_INLINES (Linux, macOS*) | Defined as '1'. | 
| _OPENMP (Windows, Linux, macOS*) | 201611 when you specify option [Q]openmp. | 
| __OPTIMIZE__ (Linux, macOS*) | Defined as '1'. | 
| __pentium4 __pentium4__ (Linux, macOS*) | Defined as '1'. | 
| _PGO_INSTRUMENT (Windows, Linux) | Defined as '1' when option [Q]cov-gen or [Q]prof-gen is specified. | 
| __PIC__ __pic__ (Linux, macOS*) | On Linux, defined as '1' when option fPIC is specified. On macOS*, defined as '1'. Only __PIC__ is allowed on macOS*. | 
| _PLACEMENT_DELETE (Linux) | Defined as '1'. | 
| __PTRDIFF_TYPE__ (Linux, macOS*) | On Linux, defined as int on IA-32 architecture; defined as long on Intel® 64 architecture. On macOS*, defined as int/long. | 
| __QMSPP_ (Windows, macOS*) | Defined as '1'. | 
| __REGISTER_PREFIX__ (Linux, macOS*) | 
 | 
| __SIGNED_CHARS__ (Windows, Linux, macOS*) | Defined as '1'. | 
| _SIZE_T_DEFINED (Windows) | Defined, no value. | 
| __SIZE_TYPE__ (Linux, macOS*) | On Linux, defined as unsigned on IA-32 architecture; defined as unsigned long on Intel® 64 architecture. On macOS*, defined as unsigned long. | 
| __SSE__ (Windows, Linux, macOS*) | On Linux and macOS*, defined as '1' for processors that support SSE instructions. On Windows, defined as '1'. It is undefined when option /arch:IA32 is specified. | 
| __SSE2__ (Windows, Linux, macOS*) | On Linux and macOS*, defined as '1' for processors that support Intel® SSE2 instructions. On Windows, defined as '1' by default or when option /arch:SSE2, /QxSSE2, /QaxSSE2, or higher processor targeting options are specified. | 
| __SSE3__ (Windows, Linux, macOS*) | On Linux and macOS*, defined as '1' for processors that support Intel® SSE3 instructions. On Windows, defined as '1' when option /arch:SSE3, /QxSSE3, or higher processor targeting options are specified. | 
| __SSE4_1__ (Windows, Linux) | On Linux, defined as '1' for processors that support Intel® SSE4 instructions. On Windows, defined as '1' when option /arch:SSE4.1, /QxSSE4.1, or higher processor targeting options are specified. | 
| __SSE4_2__ (Windows, Linux) | On Linux, defined as '1' for processors that support SSSE4 instructions. On Windows, defined as '1' when option /arch:SSE4.2, /QxSSE4.2, or higher processor targeting options are specified. | 
| __SSSE3__ (Windows, Linux, macOS*) | On Linux and macOS*, defined as '1' for processors that support SSSE3 instructions. On Windows, defined as '1' when option arch:SSSE3, QxSSSE3, or higher processor targeting options are specified. | 
| __STDC__ (macOS*) | Defined as '1'. | 
| __STDC_HOSTED__ (macOS*) | Defined as '1'. | 
| unix __unix __unix__ (Linux) | Defined as '1'. | 
| __USER_LABEL_PREFIX__ (Linux, macOS*) | 
 | 
| _VA_LIST_DEFINED (Windows) | Defined, no value. | 
| __VERSION__ (Linux, macOS*) | The compiler version string | 
| __w64 (Windows) | Defined, no value. | 
| __WCHAR_MAX__ (macOS*) | 2147483647 | 
| __WCHAR_T (Linux) | Defined as '1'. | 
| _WCHAR_T_DEFINED (Windows) | Defined when option /Zc:wchar_t is specified or "wctype_t" is defined in the header file. | 
| __WCHAR_TYPE__ (Linux, macOS*) | On Linux, defined as long int on IA-32 architecture; defined as int on Intel® 64 architecture. On macOS*, defined as long int. | 
| _WCTYPE_T_DEFINED (Windows) | Defined when "wctype_t" is defined in the header file. | 
| _WIN32 (Windows) | Defined as '1' while building code targeting IA-32 or Intel® 64 architecture. IA-32 is not available on macOS*. | 
| _WIN64 (Windows) | Defined as '1' while building code targeting Intel® 64 architecture. | 
| __WINT_TYPE__ (Linux, macOS*) | Defined as unsigned int. | 
| __x86_64 __x86_64__ (Linux, macOS*) | Defined as '1' while building code targeting Intel® 64 architecture. |