【问题标题】:Variadic macros arguments可变宏参数
【发布时间】:2013-08-11 01:40:47
【问题描述】:

我有一个断言宏,如下所示:

#define ASSERT(condition, ...) \
  (condition) ? (void)0 : MyLogFunction(__LINE__, __VA_ARGS__)

MyLogFunction 也是可变参数模板:

template<typename... Args>
void MyLogFunction(int line, const Args&... args) {/*code*/}

除了我不想在断言调用中插入其他信息的情况外,一切都很好。

所以这很好用:

ASSERT(false, "test: %s", "formatted");

但这不是:

ASSERT(false);

我相信当没有可变参数参数被传递到宏调用时,有一种方法可以处理这种情况,并且有一种方法可以插入简单的字符串 "" 而不是 __VA_ARGS__

【问题讨论】:

  • C++11 为宏添加了可变参数列表。它规定至少有一个参数对应于省略号(ISO/IEC 14882:2011 §16.3 宏替换,¶4,¶12)。 GCC 很可能提供了替代方案(gcc 具有处理 0 个变量参数的非标准机制,因此 g++ 可能也有),但这不是标准的。我建议始终提供一个值:ASSERT(false, "false");,因为它是可移植的。

标签: c++ macros c-preprocessor variadic-macros


【解决方案1】:

不是真正的宏解决方案,但一个简单的解决方法是提供一个辅助可变参数函数模板,它可以获取 0 个参数并在那里进行条件检查:

#define ASSERT(...) \
  MyLogHelper(__LINE__, __VA_ARGS__)

template<typename... Args>
void MyLogFunction(int line, const Args&... ) {/*code*/}

template<typename... Args>
void MyLogHelper(int line, bool condition, const Args&... args)
{
    if (!condition) MyLogFunction(line,args...);
}

【讨论】:

    【解决方案2】:

    没有便携的方法可以做到这一点。 看看http://en.wikipedia.org/wiki/Variadic_macro

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 2018-01-13
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      相关资源
      最近更新 更多