c中的##是什么?
我看到了这个片段:c中的##是什么?,c,gcc,syntax,c-preprocessor,C,Gcc,Syntax,C Preprocessor,我看到了这个片段: #define kthread_create(threadfn, data, namefmt, arg...) \ kthread_create_on_node(threadfn, data, -1, namefmt, ##arg) ##代表什么 当出现在宏外时,##的含义是什么 这会将传入的arg粘贴到宏扩展中。 例如: 扩展到: kthread_create_on_node(threadfn, data, -1, namefmt, foo, bar, doo);
#define kthread_create(threadfn, data, namefmt, arg...) \
kthread_create_on_node(threadfn, data, -1, namefmt, ##arg)
##
代表什么##
的含义是什么arg
粘贴到宏扩展中。
例如:
扩展到:
kthread_create_on_node(threadfn, data, -1, namefmt, foo, bar, doo);
与其他答案相反,这实际上是GCC扩展。直接在中粘贴变量args时,如果没有传递额外的args,则会出现问题。因此,当与
\uu VA\u ARGS\uu
或varargs变量(用argname…
声明)一起使用时,GCC生成#
。如果包含值,则粘贴;如果不包含值,则删除前面的逗号
此扩展的文档包括:
其次,当置于逗号和变量参数之间时,“##”标记粘贴运算符具有特殊意义。如果你写信
#define eprintf(format, ...) fprintf (stderr, format, ##__VA_ARGS__)
当使用eprintf宏时,变量参数被省略,那么“##”前面的逗号将被删除。如果传递空参数,则不会发生这种情况,如果“##”前面的标记不是逗号,也不会发生这种情况
eprintf ("success!\n")
==> fprintf(stderr, "success!\n");
对于唯一的宏参数是变量参数的情况,上面的解释是不明确的,因为试图区分没有任何参数是空参数还是缺少参数是没有意义的。在这种情况下,C99标准明确规定逗号必须保留,但是现有的GCC扩展用于吞并逗号。因此,CPP在符合特定的C标准时保留逗号,否则将其删除
这是一个有趣的用法。我从来没有见过有可变参数的。通常我看到它用于连接参数和字符串。不,这个用例实际上是一个GCC扩展,对不起。
eprintf ("success!\n")
==> fprintf(stderr, "success!\n");