関数の属性

IBM 拡張 IBM® 拡張の始まり。

関数属性は、GNU C で開発されたプログラムの移植性を向上させるためにインプリメントされている拡張です。 関数に対して指定可能な属性を使用すると、コンパイラーによる 関数呼び出しの最適化を補助し、コンパイラーに対してコードをより多面的に検査するよう明示的に指示することができます。 追加機能を提供する属性もあります。

関数属性は、キーワード __attribute__、その後に続く属性名、さらに、その属性 名が必要とする追加引数によって指定されます。関数の __attribute__ 指定は、関数の宣言ま たは定義に含まれます。構文の形式は次のとおりです。

C C のみの始まり。

構文図を読む構文図をスキップする
 関数属性の構文: 関数定義

                      .-,--------------------------.       
                      V                            |       
>>-__attribute__--((----+-attribute name---------+-+--))-------->
                        '-__--attribute_name--__-'         

>--function_declarator--{--function body--}--------------------><

C C のみの終わり。

C++ C++ のみの始まり。

構文図を読む構文図をスキップする
 関数属性の構文: 関数定義

>>-function declarator--__attribute__--------------------------->

       .-,--------------------------.          
       V                            |          
>--((----+-attribute_name---------+-+--))--;-------------------><
         '-__--attribute_name--__-'            

C++ C++ のみの終わり。

関数宣言内の関数属性は、括弧に入れたパラメーター宣言を含めて、常に宣言子の後に書きま す。
/* Specify the attribute on a function prototype declaration */
void f(int i, int j) __attribute__((individual_attribute_name));
void f(int i, int j) { }

C++ C++ のみの始まり。

C++ では、関数で存在する可能性があるすべての例外宣言の後に、属性の指定が続く必要もあります。

C++ C++ のみの終わり。

C C のみの始まり。

旧スタイルのパラメーター宣言の構文解析にあいまいさがあるため、関数定義では、属性指 定は宣言子の前で行わなければなりません。
int __attribute__((individual_attribute_name)) foo(int i) { }

C C のみの終わり。

C++ __attribute_name__ という形式 (すなわち、前後に 2 つの下線文字が付いた属性名) を使用した関数属性を指定すると、同じ名前のマクロとの名前の競合の可能性が低くなります。

次の関数属性がサポートされています。
関連情報

IBM 拡張 IBM 拡張の終わり。