1、C语言中的#
一般出现在宏定义中
例如 #define a(x) #x // # 在这里时把参数x转化为字符串
2、C语言中的##
#define a(x,y) x##y // 这里是吧 x和y链接在一起 a(2,3) ---> 23
3,可变参数列表 ...
用 ... 表示变参列表,变参列表由不确定的参数组成,各个参数之间用逗号隔开。可变参数宏使用 C99 标准新增加的一个 __VA_ARGS__
预定义标识符来表示前面的变参列表,而不是像变参函数一样,使用 va_list
、va_start
、 va_arg 、va_end
这些宏去解析变参列表。预处理器在将宏展开时,会用变参列表替换掉宏定义中的所有 __VA_ARGS__
标识符。
#define DEBUG(...) printf(__VA_ARGS__)
在GNU C中,宏可以接受可变数目的参数,就象函数一样,例如:
#define pr_debug(fmt,arg...) printk(KERN_DEBUG fmt, ##arg)
这些在gcc 和GUNC c99中支持,像ASNc 可能不行
如果
#define LOG(fmt,...) printf(fmt, ##__VA_ARGS__)
#define LOG(fmt,...) printf(fmt, ##__VA_ARGS__)
// 如果有 ##的话
编译解析为 printf(“aaaa”,); 可以编译国 ## 可以进行优化 去掉无参数的,号