2010-06-23 52 views
0

调试打印宏级联问题在C-源完全禁用调试输出, 我通常定义以下简单的宏#1与下GCC

#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

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

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

0

令牌粘贴运算符##只能用于连接令牌,正如其名称所暗示的那样。一些编译器,例如新版本的gcc,比你现在发现的更强硬地执行它。因为philippe说,但是,在这个特定的例子中,你实际上并不需要##