变体宏参数

时间:2013-08-11 01:40:47

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

我有一个断言宏,看起来像:

#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);

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

2 个答案:

答案 0 :(得分:0)

没有可移植的方法。 看看http://en.wikipedia.org/wiki/Variadic_macro

答案 1 :(得分:0)

不是宏的解决方案,但一个简单的解决方法是提供一个辅助变量函数模板,它可以获得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...);
}