gcc下调试打印宏的连接问题

时间:2010-06-23 12:54:20

标签: gcc visual-c++ concatenation c-preprocessor

要在c-source中完全禁用调试输出, 我通常定义以下SIMPLE宏#1

#define dprintf(args)

要启用调试输出,我可以定义宏#2

#define dprintf(args) printk##args

源代码中的用法如下:

dprintf(("Irqs:%lu\n",irqs));

如果我使用宏#2

,预处理器应该创建以下行

printk("Irqs:%lu\n",irqs);

在Windows Visual c ++下,没有问题。

在NETBEANS IDE 6.8下使用gcc版本4.4.1(Ubuntu 4.4.1-4ubuntu9), 我收到以下错误消息:

"printk" and "(" does not give a valid preprocessing token

我在Linux下尝试了以下内容

#define dprintk(args...) printk(args)

这只适用于 dprintf("Irqs:%lu\n",irqs);

然而,Visual C ++不知道args...

我必须在Windows上编译源代码 和Linux(386)平台交替。

有没有人有想法?

2 个答案:

答案 0 :(得分:2)

为什么不#define dprintf(args) print args

可以添加双括号来替换visual C ++中的可变参数宏:预处理器将处理宏调用,就好像只有一个参数一样。

答案 1 :(得分:0)

令牌粘贴操作符##只能用于连接令牌,顾名思义。一些编译器,例如更新版本的gcc,正如您现在发现的那样,比其他版本更严格地执行此操作。正如philippe所说,在这个特定的例子中,你实际上并不需要##