format 関数属性

関数属性 format は、引き数などの書式制御ストリングをとるユーザー定義の関数を 識別する手段を提供するものです。これにより、これらの関数の呼び出しにおいて、関数 printfscanfstrftime、および strfmon に対する呼び出しでエラーについてコンパイラーが検査するのと同様の方法で、 書式制御ストリングに関する型検査を行えるようにします。 このフィーチャーは、C89、C99、および Standard C++ および C++98 に対する直交拡張で、GNU C および C++ で開発されたアプリケーションの移植を容易にするためにインプリメントされています。

構文を以下の図で示します。 最初の引き数は、書式制御ストリングを解釈する方法のプロトタイプを示します。

                      .-,--------------------------------------------------------------------------.
                      V                                                                            |
>>-__attribute__--((----+-format-----+--(--+-printf-------+--,--string_index--,--first_to_check--)-+--))-><
                        '-__format__-'     +-scanf--------+
                                           +-strftime-----+
                                           +-strfmon------+
                                           +-__printf__---+
                                           +-__scanf__----+
                                           +-__strftime__-+
                                           '-__strfmon__--'
 
 

ここで、

string_index
ユーザー関数の宣言内のどの引き数が書式制御ストリングの引き数であるかを指定 する、定数の整数式です。 C++ では、最初の引き数が暗黙の this 引き数であるため、 非静的メンバー関数に対する string_index の最小値は、2 です。 この振る舞いは、GNU C++ の振る舞いと整合します。

first_to_check
書式制御ストリングに対して検査する最初の引き数を指定する、定数の整数式です。 書式制御ストリングに対して検査する引き数がない (つまり、書式ストリング構文およびセマンティクスで診断のみ を実行する必要がある) 場合、first_to_check には、値 0 を指定する必要があります。 strftime スタイルの書式の場合は、first_to_check0 でなければなりません。

同じ関数で複数の format 属性を指定することが可能であり、その場合、すべてが適用されます。

void my_fn(const char* a, const char* b, ...) 
       __attribute__((__format__(__printf__,1,0), __format__(__scanf__,2,3)));

また、同じストリングで異なる書式スタイルについて診断することも可能です。 すべてのスタイルが診断されます。

void my_fn(const char* a, const char* b, ...) 
       __attribute__((__format__(__printf__,2,3),
                      __format__(__strftime__,2,0),
                      __format__(__scanf__,2,3)));

関連参照

IBM Copyright 2003