You copied the Doc URL to your clipboard.

Predefined macros

The ARM compiler predefines a number of macros. These macros provide information about toolchain version numbers and compiler options.

In general, the predefined macros generated by the compiler are compatible with those generated by GCC. See the GCC documentation for more information.

The following table lists ARM-specific macro names predefined by the ARM compiler for C and C++, together with a number of the most commonly used macro names. Where the value field is empty, the symbol is only defined.

Note

Use armclang -E -dM file to see the values of predefined macros.

Table 5-1 Predefined macros

Name Value When defined
__ARM_64BIT_STATE 1

Set for 64-bit targets only.

Set to 1 if code is for 64-bit state.

__ARM_ALIGN_MAX_STACK_PWR 4

Set for 64-bit targets only.

The log of the maximum alignment of the stack object.

__ARM_ARCH ver

Specifies the version of the target architecture, for example 8.

__ARM_ARCH_EXT_IDIV__ 1

Set for 32-bit targets only.

Set to 1 if hardware divide instructions are available.

__ARM_ARCH_ISA_A64 1

Set for 64-bit targets only.

Set to 1 if the target supports the A64 instruction set.

__ARM_ARCH_PROFILE ver

Specifies the profile of the target architecture, for example A.

__ARM_FEATURE_CLZ 1

Set for 64-bit targets only.

Set to 1 if the CLZ (count leading zeroes) instruction is supported in hardware.

__ARM_FEATURE_DIV 1

Set for 64-bit targets only.

Set to 1 if the target supports fused floating-point multiply-accumulate.

__ARM_FEATURE_CRC32 1

Set for 32-bit targets only.

Set to 1 if the target has CRC instructions.

__ARM_FEATURE_CRYPTO 1

Set to 1 if the target has crypto instructions.

__ARM_FEATURE_FMA 1

Set for 64-bit targets only.

Set to 1 if the target supports fused floating-point multiply-accumulate.

__ARM_FEATURE_UNALIGNED 1

Set for 64-bit targets only.

Set to 1 if the target unaligned access in hardware.

__ARM_FP 0xE

Set for 64-bit targets only.

Set if hardware floating-point is available.

__ARM_FP_FAST 1

Set for 64-bit targets only.

Set if -ffast-math is specified.

__ARM_FP_FENV_ROUNDING 1

Set for 64-bit targets only.

Set to 1 if the implementation allows rounding to be configured at runtime using the standard C fesetround() function.

__ARM_NEON__ -

Defined when the compiler is targeting an architecture or processor with Advanced SIMD available.

Use this macro to conditionally include arm_neon.h, to permit the use of Advanced SIMD intrinsics.

__ARM_NEON_FP 7

Set for 64-bit targets only.

Set when Advanced SIMD floating-point vector instructions are available.

__ARM_PCS 1

Set for 32-bit targets only.

Set to 1 if the default procedure calling standard for the translation unit conforms to the base PCS.

__ARM_PCS_VFP 1

Set for 32-bit targets only.

Set to 1 if -mfloat-abi=hard.

__ARM_SIZEOF_MINIMAL_ENUM value

Set for 64-bit targets only.

Specifies the size of the minimal enumeration type. Set to either 1 or 4 depending on whether -fshort-enums is specified or not.

__ARMCOMPILER_VERSION nnnbbbb

Always set. Specifies the version number of the compiler, armclang.

The format is nnnbbbb, where nnn is the version number and bbbb is the build number.

For example, version 6.0 build 0654 is displayed as 6000654.

__ARMCC_VERSION nnnbbbb

A synonym for __ARMCOMPILER_VERSION.

__arm__ 1

Defined when targeting the A32 or T32 instruction sets with --target=armv8a-arm-none-eabi.

See also __aarch64__.

__aarch64__ 1

Defined when targeting the A64 instruction set with --target=aarch64-arm-none-eabi.

See also __arm__.

__cplusplus ver

Defined when compiling C++ code, and set to a value that identifies the targeted C++ standard. For example, when compiling with -xc++ -std=gnu++98, the compiler sets this macro to 199711L.

You can use the __cplusplus macro to test whether a file was compiled by a C compiler or a C++ compiler.

__CHAR_UNSIGNED__ 1 Defined if and only if char is an unsigned type.
__EXCEPTIONS 1

Defined when compiling a C++ source file with exceptions enabled.

__GNUC__ ver

Always set. It is an integer that shows the current major version of the compatible GCC version.

__GNUC_MINOR__ ver

Always set. It is an integer that shows the current minor version of the compatible GCC version.

__INTMAX_TYPE__ type Always set. Defines the correct underlying type for the intmax_t typedef.
__NO_INLINE__ 1

Defined if no functions have been inlined. The macro is always defined with optimization level -O0 or if the -fno-inline option is specified.

__OPTIMIZE__ 1

Defined when -O1, -O2, -O3, -Ofast, -Oz, or -Os is specified.

__OPTIMIZE_SIZE__ 1

Defined when -Os or -Oz is specified.

__PTRDIFF_TYPE__ type Always set. Defines the correct underlying type for the ptrdiff_t typedef.
__SIZE_TYPE__ type Always set. Defines the correct underlying type for the size_t typedef.
__SOFTFP__ 1

Set for 32-bit targets only.

Set to 1 if -mfloat-abi=soft.

__STDC__ 1 Always set. Signifies that the compiler conforms to ISO Standard C.
__STRICT_ANSI__ 1

Defined if you specify the --ansi option or specify one of the --std=c* options .

__thumb__ 1

Defined if you specify the -mthumb option.

Note

  • The compiler might generate some A32 code even if it is compiling for T32.

__UINTMAX_TYPE__ type Always set. Defines the correct underlying type for the uintmax_t typedef.
__VERSION__ ver

Always set. A string that shows the underlying Clang version.

__WCHAR_TYPE__ type Always set. Defines the correct underlying type for the wchar_t typedef.
__WINT_TYPE__ type Always set. Defines the correct underlying type for the wint_t typedef.
Was this page helpful? Yes No