関数属性は直交拡張で、GNU C で開発されたプログラムの移植性を拡張するためにインプリメントされています。 関数に対して指定可能な属性を使うと、コンパイラーによる関数呼び出しの最適化を補助し、 コンパイラーに対してコードを多面的に検査するよう明示的に指示することができます。 これ以外のものは、その他の機能性を提供します。
IBM の C および C++ は、GNU C の関数属性のサブセットをインプリメントしています。 特定の関数属性がインプリメントされていない場合は、それを指定していても受け入れられますが、そのセマンティクス は無視されます。これらの言語フィーチャーは、どの 拡張言語レベルでコンパイルする場合でも集合的に使用できます。
関数属性に対する IBM 言語拡張機能は、GNU C の構文を保持しています。__attribute_name__ という形式 (すなわち、前後に 2 つの下線文字が付いた関数属性キーワード) を使用した関数属性を指定すると、同じ名前のマクロとの名前の競合の可能性が低くなります。
キーワード __attribute__ は、属性指定子を導入します。 関数属性の一部は、変数に適用することもできます。構文の一般的な形式は 次のとおりです。
.-,---------------------------------. V | >>-__attribute__--((----+-------------------------------+-+--))->< +-individual_attribute_name-----+ '-__individual_attribute_name__-'
関数属性は宣言子に付加されます。
関数プロトタイプ宣言に指定される属性の場合、
宣言子にその属性を付すると、パラメーター・リストの右小括弧の
後に配置するのと同じ効果があります。
/* Specify the attribute on a function prototype declaration */ void f(int i, int j) __attribute__((individual_attribute_name)); void f(int i, int j) { }
古いスタイルのパラメーター宣言の解析にはあいまいさがあるので、関数定義での属性指定は宣言子の前で
行わなければなりません。
例えば以下の foo の定義では、正しい配置が示されます。
int __attribute__((individual_attribute_name)) foo(int i) { } int __attribute__((individual_attribute_name)) foo(i,j) int i; int j; { }
C++ の場合、関数属性は、宣言または定義のどちらかの宣言子の後に置かれます。
一般的な関数の場合、これは右小括弧の後でもあります。
ただし、関数に例外指定が存在する場合には、関数属性をその指定の後に置く必要があります。
関連参照