繁体   English   中英

这个C代码是什么意思(G_GNUC_PRINTF)?

[英]What does this C code mean (G_GNUC_PRINTF)?

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)))

gnome文档

如果编译器是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就像函数的arugments一样,如果它会扩展为__attribute__ ((format (printf, 1, 2)));

有关更多详细信息,请参阅

https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM