5.19 関数を ARM 関数修飾子で修飾するときの後置構文に関する推奨事項

関数宣言の前またはパラメータリストの後に __pure などの前置または後置の関数修飾子を使用できます。ARM ではより明白な後置構文を使用することを推奨します。

関数の動作または呼び出しシーケンスを変更する ARM キーワード拡張は多数あります。例えば、__pure__irq__swi__swi_indirect__softfp、および __value_in_regs は、いずれも関数の動作や呼び出しシーケンスを変更します。
これら関数修飾子の構文は、すべて共通です。__pure などの関数修飾子は、以下のいずれかの場所で関数宣言を修飾できます。
  • 関数宣言の前。以下に例を示します。
    __pure int foo(int);
    
  • パラメータリストの閉じ括弧の後。例えば、
    int foo(int) __pure;
    
単純な関数宣言の場合、各構文はあいまいではありません。ただし、戻り値の型または引数が関数ポインタである関数の場合は、前置構文があいまいになります。例えば、次の関数は関数ポインタを返しますが、__pure によって関数自体が修飾されるのか、返されるポインタの型が修飾されるのかは明白ではありません。
__pure int (*foo(int)) (int); /* (pure?) 関数へのポインタを返す
                                 (pure?) 関数として
                                 'foo' を宣言する。
                                 2 つの関数型のどちらが純関数であるかは
                                 あいまい。*/
実際、foo の宣言の前にある単一の __pure キーワードは、foo そのものだけでなくfoo によって返される関数ポインタの型も修飾しています。
一方、後置構文の場合は、引数と戻り値の型が関数ポインタである関数を宣言するときに、__pure が引数、戻り値の型、またはベース関数のいずれに適用されるかを明白に区別できます。以下に例を示します。
int (*foo1(int) __pure) (int);        /* foo1 は、通常の関数へのポインタを
                                         返す
                                         純関数です */
int (*foo2(int)) (int) __pure;        /* foo2 は、純関数へのポインタを
                                         返す
                                         関数です */
int (*foo3(int) __pure) (int) __pure; /* foo3 は、純関数へのポインタを
                                         返す
                                         関数です */
この例では、以下のようになります。
  • foo1foo3 自体が修飾されています。
  • foo2foo3 は、修飾された関数を指すポインタを返します。
  • 関数 foo3foo は同一です。
後置構文は前置構文より明白であるため、ARM 関数修飾子を使用して関数を修飾する場合は、可能な限り後置構文を使用することをお勧めします。
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.