10.161 定義済みマクロ

ARM コンパイラにより複数のマクロが事前定義されています。これらのマクロは、ツールチェーンのバージョン番号とコンパイラオプションの情報について説明しています。

次の表に、C および C++ 向けに ARM コンパイラで定義済みのマクロの名前を示します。値フィールドに記載がない場合は、シンボルが定義されているだけです。

表 10-21 定義済みマクロ

Name 定義されるケース
__arm __ -
--thumb オプションが指定されている場合でも、ARM コンパイラでは常に定義されます。
__ARMCC_VERSION も参照して下さい。
__ARM_NEON__ -
NEON を利用できることが、コンパイラオプションの --cpu および --fpu によって指定されている場合。
NEON 組み込み関数の使用を許可するために、 このマクロを使用して arm_neon.h を条件的にインクルードします。
__ARMCC_VERSION ver
常に定義されます。10 進数値で、リリースごとに増加します。値には PVVbbbb 形式が使用されます。
  • P はメジャーバージョンを示します。
  • VV はマイナーバージョンを示します。
  • bbbb はビルド番号を示します。

ARM コンパイラ 4.1 以降と、 __arm__ を定義する他のツールを区別するには、このマクロを使用します。
__APCS_INTERWORK -
--apcs /interwork オプションを指定している場合、またはターゲットプロセッサアーキテクチャを ARMv5T 以降に設定している場合
__APCS_ROPI -
--apcs /ropi オプションを指定している場合
__APCS_RWPI -
--apcs /rwpi オプションを指定している場合
__APCS_FPIC -
--apcs /fpic オプションを指定している場合
__ARRAY_OPERATORS - C++ コンパイラモードで、array new と delete がイネーブルな場合
__BASE_FILE__ name
常に定義されます。現在のソースファイルではなく元のソースファイルを示すこと(つまり、現在のファイルがインクルードされるファイルの場合)以外は、__FILE__ と同じです。
__BIG_ENDIAN - ビッグエンディアンターゲット向けにコンパイルしている場合
_BOOL -
C++ コンパイラモードで、 bool がキーワードであることを指定する場合
__cplusplus - C++ コンパイラモードの場合
__CC_ARM 1
--thumb オプションが指定されている場合でも、ARM コンパイラでは常に 1 が設定されます。
__CHAR_UNSIGNED__ - GNU モードの場合。 char が符号なしの型である場合にのみ定義されます。
__DATE__ date 常に定義されます。
__EDG__ -
常に定義されます。
__EDG_IMPLICIT_USING_STD -
C++ モードで、--using_std オプションを指定している場合
__EDG_VERSION__ -
常に Edison Design Group(EDG)フロントエンドのバージョン番号を表す整数値に設定されます。たとえば、バージョン 3.8 は 308 と表します。

EDG フロントエンドのバージョン番号は、ARM コンパイラツールチェーンのバージョン番号と一致する必要はありません。
__EXCEPTIONS 1
C++ モードで、--exceptions オプションを指定している場合
__FEATURE_SIGNED_CHAR -
signed_chars オプションを指定している場合( CHAR_MIN および CHAR_MAX によって使用)
__FILE__ name 常に文字列リテラルとして定義されます。
__FP_FAST -
--fpmode=fast オプションを指定している場合
__FP_FENV_EXCEPTIONS -
--fpmode=ieee_full オプションまたは --fpmode=ieee_fixed オプションを指定している場合
__FP_FENV_ROUNDING -
--fpmode=ieee_full オプションを指定している場合
__FP_IEEE -
--fpmode=ieee_full--fpmode=ieee_fixed、または --fpmode=ieee_no_fenv のいずれかのオプションを指定している場合
__FP_INEXACT_EXCEPTION -
--fpmode=ieee_full オプションを指定している場合
__GNUC__ ver
--gnu オプションを指定している場合。使用している GNU モードの現在のメジャーバージョンを示す整数値が設定されます。
__GNUC_MINOR__ ver
--gnu オプションを指定している場合。使用している GNU モードの現在のマイナーバージョンを示す整数値が設定されます。
__GNUG__ ver GNU モードで --cpp オプションを指定している場合。__GNUC__ と同じ値を保持します。
__IMPLICIT_INCLUDE -
--implicit_include オプションを指定している場合
__INTMAX_TYPE__ - GNU モードの場合。intmax_t typedef の 正しい潜在型を定義します。
__LINE__ num 常に、このマクロを含むコード行のソース行番号が設定されます。
__MODULE__ mod
__FILE__ の 値のファイル名部分が含まれます。
__MULTIFILE - 明示的または暗黙的に --multifile オプションを使用した場合a を使用するようにソースコードを変更することを推奨します。
__NO_INLINE__ -
GNU モードで --no_inline オプションを指定している場合
__OPTIMISE_LEVEL num
-Onum オプションを使用して 最適化レベルを変更している場合を除き、デフォルトでは常に 2 が設定されます。a
__OPTIMISE_SPACE -
-Ospace オプションを指定している場合
__OPTIMISE_TIME -
-Otime オプションを指定している場合
__OPTIMIZE__ -
GNU モードで -O1-O2、または -O3 を指定している場合
__OPTIMIZE_SIZE__ -
GNU モードで -Ospace を指定している場合
__PLACEMENT_DELETE - C++ モードで、配置の削除 (つまり、コンストラクタで例外がスローされた場合、配置演算子 new に対応する演算子 delete が 呼び出されること)がイネーブルの場合。これは、例外の使用時のみに関係します。
__PTRDIFF_TYPE__ - GNU モードの場合。intmax_t typedef の 正しい潜在型を定義します。
__RTTI - C++ モードで、RTTI がイネーブルな場合
__sizeof_int 4
sizeof(int) の場合(ただし、プリプロセッサ式でも使用できます)
__sizeof_long 4
sizeof(long) の場合(ただし、プリプロセッサ式でも使用できます)
__sizeof_ptr 4
sizeof(void *) の場合(ただし、プリプロセッサ式でも使用できます)
__SIZE_TYPE__ - GNU モードの場合。intmax_t typedef の 正しい潜在型を定義します。
__SOFTFP__ -
コンパイルで、ソフトウェア浮動小数点コール標準およびライブラリを使用する場合。ARM または Thumb で --fpu=softvfp オプションを指定する場合、または Thumb で --fpu=softvfp+vfpv2 オプションを指定する場合に設定されます。
__STDC__ - すべてのコンパイラモードの場合
__STDC_VERSION__ - 標準バージョン情報
__STRICT_ANSI__ -
--strict オプションを指定している場合
__SUPPORT_SNAN__ - --fpmode=ieee_fixed または --fpmode=ieee_full を指定する場合のシグナル NaN のサポート
__TARGET_ARCH_ARM num ターゲットプロセッサの ARM ベースアーキテクチャの番号(コンパイラで ARM と Thumb のどちらに向けてコンパイルしているかは無関係です)。各 ARM アーキテクチャバージョンで __TARGET_ARCH_ARM に指定できる値については、次の表を参照して下さい。
__TARGET_ARCH_THUMB num
ターゲットプロセッサの Thumb ベースアーキテクチャの番号(コンパイラで ARM と Thumb のどちらに向けてコンパイルしているかは無関係です)。ターゲットが Thumb をサポートしていない場合は、値に 0 が設定されます。各 ARM アーキテクチャバージョンで __TARGET_ARCH_THUMB に指定できる値については、次の表を参照して下さい。
__TARGET_ARCH_XX -
XX はターゲットアーキテクチャを表し、その値はターゲットアーキテクチャによって異なります。たとえば、コンパイラオプション --cpu=4T または --cpu=ARM7TDMI を指定すると、__TARGET_ARCH_4T が定義されます。
__TARGET_CPU_XX -
XX はターゲットプロセッサを表します。 XX の値は --cpu コンパイラオプションから導き出されるか、何も指定していない場合はデフォルト値が使用されます。たとえば、コンパイラオプション --cpu=ARM7TM が指定されていれば __TARGET_CPU_ARM7TM が定義され、__TARGET_CPU_ で始まるその他のシンボルは定義されません。
ターゲットアーキテクチャが指定されていれば __TARGET_CPU_generic が定義されます。
--cpu に小文字で指定されたプロセッサ名は、大文字に変換されます。以下に例を示します。 --cpu=Cortex-R4 は、__TARGET_CPU_Cortex_R4 ではなく、__TARGET_CPU_CORTEX_R4 と定義されます。
プロセッサ名にハイフン(-)文字が含まれる場合、これらの文字はアンダースコア(_)に対応します。以下に例を示します。 --cpu=ARM1136JF-S__TARGET_CPU_ARM1136JF_S となります。
__TARGET_FEATURE_DIVIDE -
ターゲットアーキテクチャでハードウェア除算命令(つまり、ARMv7-M または ARMv7-R)がサポートされている場合
__TARGET_FEATURE_DOUBLEWORD -
ARMv5T 以上のバージョン
__TARGET_FEATURE_DSPMUL - ARMv5TE などの DSP 拡張乗算器が使用可能な場合
__TARGET_FEATURE_EXTENSION_REGISTER_COUNT num
NEON または VFP で使用できる 64 ビット拡張レジスタの数
__TARGET_FEATURE_MULTIPLY -
ターゲットアーキテクチャで、long 乗算命令 MULL および MULAL がサポートされている場合
__TARGET_FEATURE_MULTIPROCESSING -
以下のいずれかのオプションを指定した場合
  • --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-A12
  • --cpu=Cortex-A12.no_neon.no_vfp
  • --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 -
以下のいずれかのオプションを指定した場合
  • --cpu=Cortex-A5.neon
  • --cpu=Cortex-A8
  • --cpu=Cortex-A9
  • --cpu=Cortex-A12
  • --cpu=Cortex-A15
  • --cpu=Cortex-A7
  • --cpu=QSP
__TARGET_FEATURE_THUMB - ターゲットアーキテクチャで Thumb がサポートされている場合(ARMv4T 以降)
__TARGET_FPU_xx -
FPU の用途を示す以下のいずれかの値が設定されます。
  • __TARGET_FPU_NONE
  • __TARGET_FPU_VFP
  • __TARGET_FPU_SOFTVFP
また、以下のいずれかの --fpu オプションを使用してコンパイルする場合は、それに対応するターゲット名も設定されます。
  • --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=softvfp+vfpv4__TARGET_FPU_SOFTVFP_VFPV4
  • --fpu=softvfp+vfpv4_d16__TARGET_FPU_SOFTVFP_VFPV4_D16
  • --fpu=softvfp+fpv4-sp__TARGET_FPU_SOFTVFP_FPV4_SP
  • --fpu=vfp__TARGET_FPU_VFPV2
  • --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
  • --fpu=fpv4-sp__TARGET_FPU_FPV4_SP
__TARGET_PROFILE_A   --cpu=7-A オプションを指定している場合
__TARGET_PROFILE_R   --cpu=7-R オプションを指定している場合
__TARGET_PROFILE_M  
以下のいずれかのオプションを指定した場合
  • --cpu=6-M
  • --cpu=6S-M
  • --cpu=7-M
__thumb __ -
コンパイラが Thumb 状態の場合。つまり、 コマンドラインで --thumb オプションを指定している場合、またはソースコードで #pragma thumb を指定している場合。

  • Thumb 向けにコンパイルしている場合でも、コンパイラで一部 ARM コードが生成されることがあります。
  • #pragma thumb または #pragma arm を使用している場合、__thumb および __thumb__ が定義されたりされなかったりします。ただし、他の何らかの理由(たとえば、関数が __irq として指定される場合)で Thumb 関数が ARM コードとして生成される場合は変更されません。
__TIME__ time
常に定義されます。
__UINTMAX_TYPE__ - GNU モードの場合。intmax_t typedef の 正しい潜在型を定義します。
__USER_LABEL_PREFIX__   GNU モードの場合。空の文字列を定義します。このマクロは、一部の Linux ヘッダファイルで使用されます。
__VERSION__ ver
--gnu オプションを指定している場合。使用している GNU モードの現在のバージョンを示す文字列値が設定されます。
_WCHAR_T -
C++ モードで、 wchar_t がキーワードであることを指定する場合
__WCHAR_TYPE__ - GNU モードの場合。intmax_t typedef の 正しい潜在型を定義します。
__WCHAR_UNSIGNED__ - GNU モードで --cpp オプションを指定している場合。 wchar_t が符号なしの型である場合にのみ定義されます。
__WINT_TYPE__ - GNU モードの場合。intmax_t typedef の 正しい潜在型を定義します。
以下の表に、__TARGET_ARCH_THUMB に指定できる値、およびこれらの値が ARM アーキテクチャの各バージョンとどのように関連しているかを示します。

表 10-22 Thumb アーキテクチャバージョンと ARM アーキテクチャバージョンの関連

ARM アーキテクチャ __TARGET_ARCH_ARM __TARGET_ARCH_THUMB
v4 4 0
v4T 4 1
v5T、v5TE、v5TEJ 5 2
v6、v6K、v6Z 6 3
v6T2 6 4
v6-M、v6S-M 0 3
v7-A、v7-R 7 4
v7-M、v7E-M 0 4
関連する参考文書
10.162 組み込み関数名変数
a 
--multifile が有効になっているかどうかを __OPTIMISE_LEVEL マクロによって判別している場合、__MULTIFILE
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.