static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);
私はこれを.cファイルで見つけましたが、私はこの行を理解していません。 関数宣言が1つか2つだけありますか?このCコードは何を意味しますか(G_GNUC_PRINTF)?
このコードは何を意味していますか?
static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);
私はこれを.cファイルで見つけましたが、私はこの行を理解していません。 関数宣言が1つか2つだけありますか?このCコードは何を意味しますか(G_GNUC_PRINTF)?
このコードは何を意味していますか?
G_GNUC_PRINTF()
を参照してください、詳細については__attribute__ ((format (printf, 1, 2)));
に拡大する、機能のarugmentsようprintf
を検証するために、それを持ってglibのライブラリプリプロセッサマクロです。 (glib-2.4.5/glib/gmacros.h
から)次のように定義されているGCCコンパイラ :
#define G_GNUC_PRINTF(format_idx, arg_idx) \
__attribute__((__format__ (__printf__, format_idx, arg_idx)))
gnome documentationから:コンパイラがGCCである場合
は、GNU C形式の関数属性に展開します。これは、printf()と同じ構文で、可変数の引数を取る関数を宣言するために使用されます。コンパイラは、関数に渡された引数を型チェックできます。
セミコロンの直前で、関数宣言の後に属性を配置します。
パラメータ:
format_idx
:
arg_idx
(引数は1から番号付けされる)フォーマット文字列に対応する引数の指標:フォーマット引数の最初のインデックス
例1:
static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);
// | | | |
// format string, format_idx = 1 ----+ | <----+ |
// format arguments, arg_idx = 2 ---------+ <-------+
例2:
static void foo_debug(int foo, const char* fmt, ...) G_GNUC_PRINTF(2, 3);
// | | | | |
// not a printf argument --+ | | | |
// format string, format_idx = 2 -----------+ | <----+ |
// format arguments, arg_idx = 3 ----------------+ <-------+
概要:
ただ一つの関数の宣言や二つはありますか?
1つのprintf()のような関数が定義されています。マクロは、関数に渡された引数の型チェックをコンパイラに指示します。
ここで宣言されている関数は1つだけです。宣言はstatic void ddict_debug(const char* fmt, ...);
であり、G_GNUC_PRINTF(1, 2)
部分はコンパイラ固有の関数注釈に展開される可能性が高いマクロです。例えば、GCCは場合にそれが
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
お返事ありがとうございます。 –
ありがとうございました。これは私が必要とするものです。 –