You copied the Doc URL to your clipboard.

Compiler predefines

This topic documents the predefined macros of the ARM compiler.

Predefined macros

Table 28 lists the macro names predefined by the ARM compiler for C and C++. Where the value field is empty, the symbol is only defined.

Table 28. Predefined macros
NameValueWhen defined
__arm__-

Always defined for the ARM compiler, even when you specify the --thumb option.

See also __ARMCC_VERSION.

__ARM_NEON__-

When compiler --cpu and --fpu options indicate that NEON is available.

This macro can be used to conditionally include arm_neon.h, to permit the use of NEON intrinsics.

__ARMCC_VERSIONver

Always defined. It is a decimal number, and is guaranteed to increase between releases. The format is PVVbbbb where:

  • P is the major version

  • VV is the minor version

  • bbbb is the build number.

Note

Use this macro to distinguish between ARM Compiler 4.1 or later, and other tools that define __arm__.

__APCS_INTERWORK-

When you specify the --apcs /interwork option or set the CPU architecture to ARMv5T or later.

__APCS_ROPI-

When you specify the --apcs /ropi option.

__APCS_RWPI-

When you specify the --apcs /rwpi option.

__APCS_FPIC-

When you specify the --apcs /fpic option.

__ARRAY_OPERATORS-In C++ compiler mode, to specify that array new and delete are enabled.
__BASE_FILE__name

Always defined. Similar to __FILE__, but indicates the primary source file rather than the current one (that is, when the current file is an included file).

__BIG_ENDIAN-If compiling for a big-endian target.
_BOOL-

In C++ compiler mode, to specify that bool is a keyword.

__cplusplus-In C++ compiler mode.
__CC_ARM1

Always set to 1 for the ARM compiler, even when you specify the --thumb option.

__CHAR_UNSIGNED__-In GNU mode. It is defined if and only if char is an unsigned type.
__DATE__dateAlways defined.
__EDG__-

Always defined.

__EDG_IMPLICIT_USING_STD-

In C++ mode when you specify the --using_std option.

__EDG_VERSION__-

Always set to an integer value that represents the version number of the Edison Design Group (EDG) front-end. For example, version 3.8 is represented as 308.

The version number of the EDG front-end does not necessarily match the version number of the ARM compiler toolchain.

__EXCEPTIONS1

In C++ mode when you specify the --exceptions option.

__FEATURE_SIGNED_CHAR-

When you specify the --signed_chars option (used by CHAR_MIN and CHAR_MAX).

__FILE__nameAlways defined as a string literal.
__FP_FAST-

When you specify the --fpmode=fast option.

__FP_FENV_EXCEPTIONS-

When you specify the --fpmode=ieee_full or --fpmode=ieee_fixed options.

__FP_FENV_ROUNDING-

When you specify the --fpmode=ieee_full option.

__FP_IEEE-

When you specify the --fpmode=ieee_full, --fpmode=ieee_fixed, or --fpmode=ieee_no_fenv options.

__FP_INEXACT_EXCEPTION-

When you specify the --fpmode=ieee_full option.

__GNUC__ver

When you specify the --gnu option. It is an integer that shows the current major version of the GNU mode being used.

__GNUC_MINOR__ver

When you specify the --gnu option. It is an integer that shows the current minor version of the GNU mode being used.

__GNUG__verIn GNU mode when you specify the --cpp option. It has the same value as __GNUC__.
__IMPLICIT_INCLUDE-

When you specify the --implicit_include option.

__INTMAX_TYPE__-In GNU mode. It defines the correct underlying type for the intmax_t typedef.
__LINE__numAlways set. It is the source line number of the line of code containing this macro.
__MODULE__mod

Contains the filename part of the value of __FILE__.

__MULTIFILE-When you explicitly or implicitly use the --multifile option.[a]
__NO_INLINE__-

When you specify the --no_inline option in GNU mode.

__OPTIMISE_LEVELnum

Always set to 2 by default, unless you change the optimization level using the -Onum option.[a]

__OPTIMISE_SPACE-

When you specify the -Ospace option.

__OPTIMISE_TIME-

When you specify the -Otime option.

__OPTIMIZE__-

When -O1, -O2, or -O3 is specified in GNU mode.

__OPTIMIZE_SIZE__-

When -Ospace is specified in GNU mode.

__PLACEMENT_DELETE-In C++ mode to specify that placement delete (that is, an operator delete corresponding to a placement operator new, to be called if the constructor throws an exception) is enabled. This is only relevant when using exceptions.
__PTRDIFF_TYPE__-In GNU mode. It defines the correct underlying type for the ptrdiff_t typedef.
__RTTI-In C++ mode when RTTI is enabled.
__sizeof_int4

For sizeof(int), but available in preprocessor expressions.

__sizeof_long4

For sizeof(long), but available in preprocessor expressions.

__sizeof_ptr4

For sizeof(void *), but available in preprocessor expressions.

__SIZE_TYPE__-In GNU mode. It defines the correct underlying type for the size_t typedef.
__SOFTFP__-

If compiling to use the software floating-point calling standard and library. Set when you specify the --fpu=softvfp option for ARM or Thumb, or when you specify --fpu=softvfp+vfpv2 for Thumb.

__STDC__-In all compiler modes.
__STDC_VERSION__-Standard version information.
__STRICT_ANSI__-

When you specify the --strict option.

__SUPPORT_SNAN__-Support for signalling NaNs when you specify --fpmode=ieee_fixed or --fpmode=ieee_full.
__TARGET_ARCH_ARMnumThe number of the ARM base architecture of the target CPU irrespective of whether the compiler is compiling for ARM or Thumb. For possible values of __TARGET_ARCH_ARM in relation to the ARM architecture versions, see Table 29.
__TARGET_ARCH_THUMBnum

The number of the Thumb base architecture of the target CPU irrespective of whether the compiler is compiling for ARM or Thumb. The value is defined as zero if the target does not support Thumb. For possible values of __TARGET_ARCH_THUMB in relation to the ARM architecture versions, see Table 29.

__TARGET_ARCH_XX-

XX represents the target architecture and its value depends on the target architecture. For example, if you specify the compiler options --cpu=4T or --cpu=ARM7TDMI then __TARGET_ARCH_4T is defined.

__TARGET_CPU_XX-

XX represents the target CPU. The value of XX is derived from the --cpu compiler option, or the default if none is specified. For example, if you specify the compiler option --cpu=ARM7TM then __TARGET_CPU_ARM7TM is defined and no other symbol starting with __TARGET_CPU_ is defined.

If you specify the target architecture, then __TARGET_CPU_generic is defined.

If the CPU name specified with --cpu is in lowercase, it is converted to uppercase. For example, --cpu=Cortex-R4 results in __TARGET_CPU_CORTEX_R4 being defined (rather than __TARGET_CPU_Cortex_R4).

If the processor name contains hyphen (-) characters, these are mapped to an underscore (_). For example, --cpu=ARM1136JF-S is mapped to __TARGET_CPU_ARM1136JF_S.

__TARGET_FEATURE_DOUBLEWORD-

ARMv5T and above.

__TARGET_FEATURE_DSPMUL-If the DSP-enhanced multiplier is available, for example ARMv5TE.
__TARGET_FEATURE_MULTIPLY-

If the target architecture supports the long multiply instructions MULL and MULAL.

__TARGET_FEATURE_DIVIDE-

If the target architecture supports the hardware divide instruction (that is, ARMv7-M or ARMv7-R).

__TARGET_FEATURE_MULTIPROCESSING-

When you specify any of the following options:

  • --cpu=Cortex-A9

  • --cpu=Cortex-A9.no_neon

  • --cpu=Cortex-A9.no_neon.no_vfp

  • --cpu=Cortex-A5

  • --cpu=Cortex-A5.vfp

  • --cpu=Cortex-A5.neon

  • --cpu=Cortex-A15

  • --cpu=Cortex-A15.no_neon

  • --cpu=Cortex-A15.no_neon.no_vfp

  • --cpu=Cortex-A7

  • --cpu=Cortex-A7.no_neon

  • --cpu=Cortex-A7.no_neon.no_vfp

__TARGET_FEATURE_NEON-

When you specify any of the following options:

  • --cpu=Cortex-A5.neon

  • --cpu=Cortex-A8

  • --cpu=Cortex-A9

  • --cpu=Cortex-A15

  • --cpu=Cortex-A7

  • --cpu=QSP

__TARGET_FEATURE_THUMB-If the target architecture supports Thumb, ARMv4T or later.
__TARGET_FPU_xx-

One of the following is set to indicate the FPU usage:

  • __TARGET_FPU_NONE

  • __TARGET_FPU_VFP

  • __TARGET_FPU_SOFTVFP

In addition, if compiling with one of the following --fpu options, the corresponding target name is set:

  • --fpu=softvfp+vfpv2, __TARGET_FPU_SOFTVFP_VFPV2

  • --fpu=softvfp+vfpv3, __TARGET_FPU_SOFTVFP_VFPV3

  • --fpu=softvfp+vfpv3_fp16, __TARGET_FPU_SOFTVFP_VFPV3_FP16

  • --fpu=softvfp+vfpv3_d16, __TARGET_FPU_SOFTVFP_VFPV3_D16

  • --fpu=softvfp+vfpv3_d16_fp16, __TARGET_FPU_SOFTVFP_VFPV3_D16_FP16

  • --fpu=vfpv2, __TARGET_FPU_VFPV2

  • --fpu=vfpv3, __TARGET_FPU_VFPV3

  • --fpu=vfpv3_fp16, __TARGET_FPU_VFPV3_FP16

  • --fpu=vfpv3_d16, __TARGET_FPU_VFPV3_D16

  • --fpu=vfpv3_d16_fp16, __TARGET_FPU_VFPV3_D16_FP16

  • --fpu=vfpv4, __TARGET_FPU_VFPV4

  • --fpu=vfpv4_d16, __TARGET_FPU_VFPV4_D16

See --fpu=name for more information.

__TARGET_PROFILE_A When you specify the --cpu=7-A option.
__TARGET_PROFILE_R When you specify the --cpu=7-R option.
__TARGET_PROFILE_M 

When you specify any of the following options:

  • --cpu=6-M

  • --cpu=6S-M

  • --cpu=7-M

__thumb__-

When the compiler is in Thumb mode. That is, you have either specified the --thumb option on the command-line or #pragma thumb in your source code.

Note

  • The compiler might generate some ARM code even if it is compiling for Thumb.

  • __thumb and __thumb__ become defined or undefined when using #pragma thumb or #pragma arm, but do not change in cases where Thumb functions are generated as ARM code for other reasons (for example, a function specified as __irq).

__TIME__time

Always defined.

__UINTMAX_TYPE__-In GNU mode. It defines the correct underlying type for the uintmax_t typedef.
__USER_LABEL_PREFIX__ In GNU mode. It defines an empty string. This macro is used by some of the Linux header files.
__VERSION__ver

When you specify the --gnu option. It is a string that shows the current version of the GNU mode being used.

_WCHAR_T-

In C++ mode, to specify that wchar_t is a keyword.

__WCHAR_TYPE__-In GNU mode. It defines the correct underlying type for the wchar_t typedef.
__WCHAR_UNSIGNED__-In GNU mode when you specify the --cpp option. It is defined if and only if wchar_t is an unsigned type.
__WINT_TYPE__-In GNU mode. It defines the correct underlying type for the wint_t typedef.

[a] ARM recommends that if you have source code reliant on the __OPTIMISE_LEVEL macro to determine whether or not --multifile is in effect, you change to using__MULTIFILE.


Table 29 shows the possible values for __TARGET_ARCH_THUMB (see Table 28), and how these values relate to versions of the ARM architecture.

Table 29. Thumb architecture versions in relation to ARM architecture versions
ARM architecture__TARGET_ARCH_ARM__TARGET_ARCH_THUMB
v440
v4T41
v5T, v5TE, v5TEJ52
v6, v6K, v6Z63
v6T264
v6-M, v6S-M03
v7-A, v7-R74
v7-M, v7E-M04

Function names

Table 30 lists builtin variables supported by the compiler for C and C++.

Table 30. Builtin variables
NameValue
__FUNCTION__

Holds the name of the function as it appears in the source.

__FUNCTION__ is a constant string literal. You cannot use the preprocessor to join the contents to other text to form new tokens.

__PRETTY_FUNCTION__

Holds the name of the function as it appears pretty printed in a language-specific fashion.

__PRETTY_FUNCTION__ is a constant string literal. You cannot use the preprocessor to join the contents to other text to form new tokens.


Was this page helpful? Yes No