【问题标题】:Need to pass arguments to dev_err macro需要将参数传递给 dev_err 宏
【发布时间】:2013-06-21 17:24:04
【问题描述】:

有一个包装函数xxxTRACE(uint loglevel, const char* message, ...),需要检查loglevel值并使用dev_err、dev_warn和...宏强>。由于例如: dev_err 签名是 dev_err(struct device *dev, char *fmt, args...),我能够传递消息字符串而不会出现任何错误,但无法传递参数,尝试传递为 dev_err(dev, message, ...), dev_err(dev, message, __VA_ARGS__),得到错误 " '...'"之前的预期表达式。请让我知道如何传递论点。谢谢:-)

【问题讨论】:

    标签: c


    【解决方案1】:

    这与 printf 的签名相同。您以相同的格式传递消息:例如:

    dev_err("Hello World\n");
    dev_warn("I'm getting old, I'm now: %d years old", my_age);
    

    `

    【讨论】:

    • 问题是关于转发可变参数的。
    • 您不能将可变参数转发到宏。你可以给一个函数。用函数包装宏的原因是什么?这没有任何意义......你会使用一个宏来内联......但是一旦你在它周围放置一个函数,情况就不再如此了。代码示例的问题不是很清楚,这就是我误解它的原因。
    • 所以我不能将可变参数从函数传递给宏是吗?
    【解决方案2】:

    我通常在__VA_ARGS__ 可用的地方使用宏。我不太确定哪个 C 标准支持这一点。它适用于 gnu99,也许适用于 gnu89。

    #define xxxTRACE(loglevel, message, ...) do { \
        if (loglevel == 0) { \
            dev_err(dev, message, __VA_ARGS__) \
        } else { \
            dev_warn(dev, message, __VA_ARGS__) \
        } \
    } while (0)
    

    【讨论】:

      猜你喜欢
      • 2015-12-04
      • 2018-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多