【问题标题】:Concatenation problems with debug print macro under gccgcc下调试打印宏的串联问题
【发布时间】:2010-06-23 12:54:19
【问题描述】:

要完全禁用 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) 平台。

有人有想法吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-17
        • 2010-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多