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

Cha*_*Kim 2 c macros

有时,在我从Linux驱动程序中借用的C代码中,我想将一些宏更改为我可以在我的环境中使用的函数.但是这个以前的宏可以采用3或4个参数.
例如,如果我想要替代

SMSC_TRACE(pdata, probe, "Driver Parameters:");   // 3 arguments  
Run Code Online (Sandbox Code Playgroud)

printf("Driver Parameters:");  
Run Code Online (Sandbox Code Playgroud)

替代

SMSC_TRACE(pdata, probe, "LAN base: 0x%08lX", (unsigned long)pdata->ioaddr); // 4 arguments  
Run Code Online (Sandbox Code Playgroud)

printf("LAN base: 0x%08lX", (unsigned long)pdata->ioaddr);  
Run Code Online (Sandbox Code Playgroud)

我怎么做?我试过了

#define SMSC_TRACE((a), (b), (c)) printf((c))  
#define SMSC_TRACE((a), (b), (c), (d)) printf((c), (d))  
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.只有最后一个似乎生效.

编辑:这似乎也许.

#define SMSC_TRACE(pdata, nlevel, fmt, args...) printf(fmt "\n", ##args)
Run Code Online (Sandbox Code Playgroud)

bar*_*nos 5

您可以使用可变参数宏来执行此操作,该采用可变数量的参数:

#define SMSC_TRACE(a,b,...) printf(__VA_ARGS__)
Run Code Online (Sandbox Code Playgroud)

如果您希望此宏执行多个语句,那么您需要一个do/while(0).

例如:

#define SMSC_TRACE(a,b,...) \
do                          \
{                           \
    printf("%c\n",a);       \
    printf("%d\n",b);       \
    printf(__VA_ARGS__);    \
}                           \
while (0)
Run Code Online (Sandbox Code Playgroud)