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

3
static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);

我在一个.c文件中发现了这行代码,但不理解它的含义:

是只有一个函数声明还是两个?

这段代码是什么意思?

2个回答

8

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()的函数。该宏告诉编译器对传递给函数的参数进行类型检查。


非常感谢。这正是我所需要的。 - Bohao LI

4

谢谢您的回答。 - Bohao LI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接