関数属性 format は、引き数などの書式制御ストリングをとるユーザー定義の関数を 識別する手段を提供するものです。これにより、これらの関数の呼び出しにおいて、関数 printf、scanf、strftime、および 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__--'
ここで、
同じ関数で複数の 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)));
関連参照