参考链接:
#、##、__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时,这里的##起到把前面多余的","去掉的作用,否则会编译出错 |
这里就不举例说明了,在开头的两个连接中举例很详细,不明白的网友,可以去看一下。