有时,在我从 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)
最佳答案
您可以使用variadic macro来做到这一点,它采用可变数量的参数:
#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)
关于c - C语言中如何用宏替换函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29650633/