【发布时间】:2016-08-15 19:49:58
【问题描述】:
static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);
我在 .c 文件中找到了这个,但我不明白这一行: 只有一个或两个函数声明吗?
这段代码是什么意思?
【问题讨论】:
static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);
我在 .c 文件中找到了这个,但我不明白这一行: 只有一个或两个函数声明吗?
这段代码是什么意思?
【问题讨论】:
G_GNUC_PRINTF() 是一个 glib 库预处理器宏。
对于 gcc 编译器,它的定义如下(来自glib-2.4.5/glib/gmacros.h):
#define G_GNUC_PRINTF( format_idx, arg_idx ) \
__attribute__((__format__ (__printf__, format_idx, arg_idx)))
如果编译器是 gcc,则扩展为 GNU C 格式函数属性。这用于声明带有可变数量参数的函数,其语法与 printf() 相同。它允许编译器对传递给函数的参数进行类型检查。
将属性放在函数声明之后,分号之前。
参数:
format_idx:格式字符串对应的参数的索引(参数从1开始编号)
arg_idx: 第一个格式参数的索引
示例 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 ----------------+ <-------+
总结:
只有一个函数声明还是两个?
定义了一个类似 printf() 的函数。宏告诉编译器对传递给函数的参数进行类型检查。
【讨论】:
这里只声明了一个函数。声明是static void ddict_debug(const char* fmt, ...);,G_GNUC_PRINTF(1, 2) 部分很可能是扩展为编译器特定函数注释的宏。例如,gcc 有它来验证 printf 之类的函数参数,如果它会扩展为 __attribute__ ((format (printf, 1, 2)));
更多详情请参考
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes
【讨论】: