参考链接:
#、##、__VA_ARGS__和##__VA_ARGS__的作用
linux中的 VA_ARGS 宏说明
最近看到linux的一段代码,对__VA_ARGS__和##__VA_ARGS__有点疑惑,所以在网上查了一下。
linux源码如下,函数功能就不废话了:
#define module_driver(__driver, __register, __unregister, ...) \
static int __init __driver##_init(void) \
{ \
return __register(&(__driver) , ##__VA_ARGS__); \
} \
module_init(__driver##_init); \
static void __exit __driver##_exit(void) \
{ \
__unregister(&(__driver) , ##__VA_ARGS__); \
} \
module_exit(__driver##_exit);
整理表格如下:
| 宏 | 功能 |
|---|---|
| ’#‘ | 字符串化 |
| ‘##’ | 字符连接的功能 |
| "__VA_ARGS__’ | 这个可变参数的宏是新的C99规范中新增的, 和变参函数中的...一致 |
| ‘##__VA_ARGS__’ | 宏前面加上##的作用在于,当可变参数的个数为0时,这里的##起到把前面多余的","去掉的作用,否则会编译出错 |
这里就不举例说明了,在开头的两个连接中举例很详细,不明白的网友,可以去看一下。

文章介绍了Linux中__VA_ARGS__和##__VA_ARGS__这两个宏的作用,前者用于处理可变参数,后者在参数个数为0时去除多余逗号。C99规范引入了__VA_ARGS__,而##用于连接这些参数。
628

被折叠的 条评论
为什么被折叠?



