型属性
型属性は、関数の呼び出し方法、またはデータオブジェクトのアクセス方法を定義します。すなわち、型属性を使用する場合には、関数またはデータオブジェクトの定義時と宣言時の両方で型属性を指定する必要があります。
型属性を明示的に宣言に配置するか、プラグマディレクティブ#pragma type_attributeを使用します。
汎用型属性
利用可能な関数型属性(関数の呼び出し方法に影響):
__arm、__cmse_nonsecure_call、__exception、__fiq、__interwork、__irq、__svc、__swi、__task、および__thumb.
利用可能なデータ型属性:
__big_endian、__little_endian、および__packed.
間接参照レベルごとに、必要な数の属性を指定できます。
注記
データ型属性 (except __packed) は、構造体型フィールドでは使用できません。
データオブジェクトで使用される型属性の構文
統一属性構文を選択すると、データ型属性は型修飾子const と volatileと同じ構文規則を使用します。
そうでない場合は、データ型属性は、構文規則の型修飾子const および volatileとほぼ同じように使用します。以下に例を示します。
__little_endian int i; int __little_endian j;
i と j 、両方ともリトルエンディアンのバイトオーダーでアクセスされます。
constやvolatileとは異なり、構造体メンバの宣言の場合を除いて、型属性は派生した型の型指定子の前に使用されるとき、型属性がオブジェクトまたはtypedef自体に適用されます。
型定義を使用することはコードをより明確にできる場合があります。
typedef __packed int packed_int; packed_int *q1;
packed _intはパックド整数に対するtypedefです。変数q1はそのような整数を指し示すことができます。
#pragma type_attributesディレクティブを使用して宣言の型属性を指定することもできます。プラグマディレクティブで指定した型属性は、データオブジェクトまたは制限されるtypedefに適用されます。
#pragma type_attribute=__packed
int * q2;変数q2はパックされます。
均一の属性構文の詳細については、‑‑uniform_attribute_syntaxおよび‑‑no_uniform_attribute_syntaxを参照してください。
関数で使用される型属性の構文
関数の型属性に使用する構文は、データオブジェクトの型属性の構文とはわずかに異なります。関数の場合、属性はリターン型の前に置くか、関数ポインタの括弧内に置く必要があります。例:
__irq __arm void my_handler(void);または
void (__irq __arm * my_fp)(void);また#pragma type_attributeを使用して、関数型属性を指定できます。
#pragma type_attribute=__irq __arm void my_handler(void); #pragma type attribute=__irq __arm typedef void my_fun_t(void); my_fun_t * my_fp;