この属性を指定すると、コンパイラは、関数の出力を printf
スタイル関数への呼び出しで使用する場合に、指定した引数でプレースホルダーの型チェックを実行します。
注
この関数属性は、ARM コンパイラがサポートする GNU コンパイラ拡張機能です。
例
以下のサンプルでは、フォーマットストリングを printf()
に提供する 2 つの関数 myFormatText1()
と myFormatText2()
を宣言します。
最初の関数 myFormatText1()
は、format_arg
属性を指定しません。コンパイラは、フォーマットストリングとの一貫性について printf
引数の型を確認しません。
2 番目の関数 myFormatText2()
は、format_arg
属性を指定します。printf()
への次の呼び出しで、コンパイラは、提供された引数の型 a
および b
が myFormatText2()
へのフォーマットストリング引数と一貫していることを確認します。コンパイラは、int
を使用できる場合に float
が提供されると、警告を生成します。
#include <stdio.h>
// printf によって使用される関数。フォーマットの型の確認なし。
extern char *myFormatText1 (const char *);
// printf によって使用される関数。引数 1 でフォーマットの型の確認。
extern char *myFormatText2 (const char *) __attribute__((format_arg(1)));
int main(void) {
int a;
float b;
a = 5;
b = 9.099999;
printf(myFormatText1("Here is an integer:%d\n"), a); // 型の確認なし。いずれにせよ型は一致しています。
printf(myFormatText1("Here is an integer:%d\n"), b); // 型の確認なし。型は一致しませんが、警告はありません
printf(myFormatText2("Here is an integer:%d\n"), a); // 型の確認。型は一致しています。
printf(myFormatText2("Here is an integer:%d\n"), b); // 型の確認。型が一致しない場合は警告:#181-D
}
$ armcc format_arg_test.c -c
"format_arg_test.c"、行 18:警告:#181-D:引数は対応するフォーマットストリング変換と互換性がありません
printf(myFormatText2("Here is an integer:%d\n"), b);
^
format_arg_test.c:警告 1 つ、エラーなし