【问题标题】:How to pass arguments to a variadic macro?如何将参数传递给可变参数宏?
【发布时间】:2012-05-22 10:20:27
【问题描述】:

我有一个可变参数函数:

LogWrite(FILE * fp, int level, const char * filename, const char * function, ...)

应该这样调用:

LogWrite(fp, int Level, __FILE__, __FUNCTION__, "Message: %s", message)

但是,我想写一个可变参数宏来更容易调用:

1: #define LOGWRITE_L1(...) LogWrite(file, 1, __FILE__, __FUNCTION__, ...)
or
2: #define LOGWRITE_L1(file, ...) LogWrite(file, 1, __FILE__, __FUNCTION__, ...)

这样开发人员可以使用以下方式调用它:

LOGWRITE_L1(myfile, "Hello!");

而不是

LogWrite(myfile, 1, __FILE__, __FUNCTION__, "Hello!")

但是,这两种方法都会给我一个编译器错误。

1: expected expression before '...'
2:'file' undeclared (first use in this function)

这是可能的还是我在浪费时间?我以前从未使用过可变参数函数,所以不确定。我的函数有效...我使用完整的声明调用它,并将它写入我想要的文件。

【问题讨论】:

  • 您的示例代码中似乎放错了int Level...(我很确定我知道您的意思,但最好让您修复它。)
  • 谢谢!哈哈,那会很尴尬。

标签: c function macros variadic-functions variadic-macros


【解决方案1】:

您必须将__VA_ARGS__ 替换为可变参数:

#define LOGWRITE_L1(file, ...) LogWrite(file, 1, __FILE__, __FUNCTION__, __VA_ARGS__)

这只是 C99、C11 和 C++11 标准的一部分。一些编译器提供与可变参数宏处理有关的扩展;检查你的手册。

【讨论】:

    【解决方案2】:

    使用__VA_ARGS__ 代替...

    #define LOGWRITE_L1(file, ...) LogWrite(file, 1, __FILE__, __FUNCTION__, __VA_ARGS__)
    

    【讨论】:

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