如何在C中使用宏替换函数

时间:2015-04-15 12:47:18

标签: c macros

有时,在我从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)

1 个答案:

答案 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)