# Additional Predefined Macros

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*.

### Note

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. ### Note Available 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. ### Note Available 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. ### Note This macro may be affected by compiler options, such as -no-icc.
__ICL (Windows) | The version of the compiler. ### Note This 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. ### Note This 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]ms n.
__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 ### Note Available only for compilations targeting Intel® 64 architecture.
__LP64__ (Linux) __LP64 (Linux) | Defined as '1'. ### Note Available 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.

Parent topic: Macros

## See Also

arch compiler option
march compiler option
m compiler option
intel-extensions, Qintel-extensions compiler option
D compiler option
U compiler option
qopenmp, Qopenmp compiler option
x, Qx compiler option
ISO Standard Predefined Macros