LoginSignup
4
4

More than 5 years have passed since last update.

format属性

Posted at

systemdには_printf_というマクロがある。

src/shared/macro.h
#define _printf_(a,b) __attribute__ ((format (printf, a, b)))

GCC拡張のformat属性を簡単に指定するためのもので、関数宣言に指定して使われる。

src/shared/log.h
int log_meta(
                int level,
                const char*file,
                int line,
                const char *func,
                const char *format, ...) _printf_(5,6);

定義からなんとなく推測できるように、このマクロを指定しておくと、指定した関数の引数がprintfフォーマットを満たしているかどうか、コンパイル時にチェックしてくれるようになる。引数をprintf系の標準ライブラリ関数にそのまま渡すような関数でも、コンパイル時チェック対象にすることができる。

format属性についてもうちょっと説明する。format属性は3つの引数を取り、第一引数はフォーマット種別、第二引数はフォーマット文字列の引数の位置、第三引数はフォーマット文字列でチェックされる引数の最初の位置を指定する。フォーマット種別には、printfscanfといった標準ライブラリ関数のもの以外にも、MinGWやglibcの拡張に対応したフォーマットを指定可能である(ms_printfgnu_printf)。

より詳しくは、GCCのドキュメントを参照のこと。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4