【问题标题】:What does this C code mean (G_GNUC_PRINTF)?这个 C 代码是什么意思(G_GNUC_PRINTF)?
【发布时间】:2016-08-15 19:49:58
【问题描述】:
static void ddict_debug(const char* fmt, ...) G_GNUC_PRINTF(1, 2);

我在 .c 文件中找到了这个,但我不明白这一行: 只有一个或两个函数声明吗?

这段代码是什么意思?

【问题讨论】:

    标签: c static void glib


    【解决方案1】:

    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 documentation

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

    【讨论】:

    • 非常感谢。这正是我所需要的。
    【解决方案2】:

    这里只声明了一个函数。声明是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

    【讨论】:

    • 感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多