有时,在我从Linux驱动程序中借用的C代码中,我想将一些宏更改为我可以在我的环境中使用的函数。但是这个以前的宏可以带3个或4个参数 例如,如果我想要替换
SMSC_TRACE(pdata, probe, "Driver Parameters:"); // 3 arguments
进入
printf("Driver Parameters:");
并替换
SMSC_TRACE(pdata, probe, "LAN base: 0x%08lX", (unsigned long)pdata->ioaddr); // 4 arguments
进入
printf("LAN base: 0x%08lX", (unsigned long)pdata->ioaddr);
我该怎么做?我试过了
#define SMSC_TRACE((a), (b), (c)) printf((c))
#define SMSC_TRACE((a), (b), (c), (d)) printf((c), (d))
但它似乎不起作用。只有最后一个似乎生效。
编辑:这似乎也许。
#define SMSC_TRACE(pdata, nlevel, fmt, args...) printf(fmt "\n", ##args)
答案 0 :(得分:5)
您可以使用variadic macro来执行此操作,该{{3}}采用可变数量的参数:
#define SMSC_TRACE(a,b,...) printf(__VA_ARGS__)
如果您希望此宏执行多个语句,则需要do/while(0)
。
例如:
#define SMSC_TRACE(a,b,...) \
do \
{ \
printf("%c\n",a); \
printf("%d\n",b); \
printf(__VA_ARGS__); \
} \
while (0)