要在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)平台交替。
有没有人有想法?
答案 0 :(得分:2)
为什么不#define dprintf(args) print args
?
可以添加双括号来替换visual C ++中的可变参数宏:预处理器将处理宏调用,就好像只有一个参数一样。
答案 1 :(得分:0)
令牌粘贴操作符##
只能用于连接令牌,顾名思义。一些编译器,例如更新版本的gcc,正如您现在发现的那样,比其他版本更严格地执行此操作。正如philippe所说,在这个特定的例子中,你实际上并不需要##
。