format

format 関数属性を使用することにより、書式制御ストリングを引数として取るユーザ ー定義関数を識別することができます。これにより、これらの関数に対する呼び出しは、書式制御 ストリングと対照して型検査されます。これは、コンパイラーが、 関数 printfscanfstrftime、および strfmon に対する呼び出しをエラーがないか検査する方法に似ています。

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

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

説明:
string_index
ユーザー関数の宣言内のどの引数が書式制御ストリングであるかを指定する定数整数式です。C++ のみの始まりC++ では、非静的メンバー関数の string_index の最小値は 2 です。これは、最初の引数が暗黙の this 引数であるためです。 この振る舞いは、GNU C++ の振る舞いと一貫性があります。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)));