format
format 関数属性を使用することにより、書式制御ストリングを引数として取るユーザ ー定義関数を識別することができます。これにより、これらの関数に対する呼び出しは、書式制御 ストリングと対照して型検査されます。これは、コンパイラーが、 関数 printf、scanf、strftime、および strfmon に対する呼び出しをエラーがないか検査する方法に似ています。
説明:format 関数属性の構文 .-,--------------------------------------------------------------------------. V | >>-__attribute__--((----+-format-----+--(--+-printf-------+--,--string_index--,--first_to_check--)-+--))->< '-__format__-' +-scanf--------+ +-strftime-----+ +-strfmon------+ +-__printf__---+ +-__scanf__----+ +-__strftime__-+ '-__strfmon__--'
- string_index
- ユーザー関数の宣言内のどの引数が書式制御ストリングであるかを指定する定数整数式です。
C++ では、非静的メンバー関数の string_index の最小値は 2 です。これは、最初の引数が暗黙の this 引数であるためです。
この振る舞いは、GNU C++ の振る舞いと一貫性があります。
- first_to_check
- これは、書式制御ストリングに照らして検査する最初の引数を指定する定数整数式です。 書式制御ストリングに照らして検査すべき引数がない場合 (つまり、書式制御ストリングの構文およびセマンティクスについてのみ診断を行う 場合) は、first_to_check の値には 0 を指定します。strftime スタイルの書式の場合 は、first_to_check は 0 でなければなりません。
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)));
