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

関数の動作または呼び出しシーケンスを変更する ARM キーワード拡張は多数あります。例えば、__pure__irq__swi__swi_indirect__softfp、および __value_in_regs は、いずれも関数の動作や呼び出しシーケンスを変更します。

これら関数修飾子の構文は、すべて共通です。__pure などの関数修飾子は、以下のいずれかの場所で関数宣言を修飾できます。

単純な関数宣言の場合、各構文はあいまいではありません。ただし、戻り値の型または引数が関数ポインタである関数の場合は、前置構文があいまいになります。例えば、次の関数は関数ポインタを返しますが、__pure によって関数自体が修飾されるのか、返されるポインタの型が修飾されるのかは明白ではありません。

__pure int (*foo(int)) (int); /* (純?)関数へのポインタを返す
                                 (純?)関数として '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 は、純関数へのポインタを
                                         返す純関数 */

この例では、以下のようになります。

後置構文は前置構文より明白なので、ARM 関数修飾子を使用して関数を修飾する場合は、可能な限り後置構文を使用することをお勧めします。

Show/hide関連項目

Copyright © 2010 ARM. All rights reserved.ARM DUI 0472BJ
Non-ConfidentialID011811