【发布时间】: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