宏定义中的##作用
在 GNU C 中,宏也可以接受可变数目的参数,例如:
#def ine pr_debug(fmt,arg…) printk(fmt,##arg)
这里 arg 表示其余的参数,可以有零个或多个参数,这些参数以及参数之间的逗号构成arg 的值,在宏扩展时替换 arg,如下列代码:
pr_debug(“%s:%d”,filename,line)
会被扩展为:
printk(“%s:%d”, filename, line)
使用“##”是为了处理 arg 不代表任何参数的情况,这时候,前面的逗号就变得多余了。
使用“##”之后,GNU C 预处理器会丢弃前面的逗号,这样,下列代码:
pr_debug(“success!\n”)
会被正确地扩展为:
printk(“success!\n”)
而不是:
printk(“success!\n”,)
这正是我们希望看到的。
上文摘抄自《Linux设备驱动开发详解:基于最新的Linux 4.0内核》