我想创建一个自定义版本的 assert
<cassert>
中定义的宏,当断言失败时显示错误消息。
所需的用法:
custom_assert(AClass<T1, T2>::aBoolMethod(), "aBoolMethod must be true");
有缺陷的测试实现:
#define custom_assert(mCondition, mMessage) ...
// This fails because mCondition may have commas in it
#define custom_assert(..., mMessage)
// Not sure about this either - mMessage may be an expression containing commas
// as well
如何正确实现将 bool 表达式(可能带有逗号)作为第一个参数并将字符串表达式(可能带有逗号)作为第二个参数的自定义断言?
或者有没有不使用宏就可以实现断言的方法?
最佳答案
你已经很接近了,你需要使用的只是这个:
#define myAssert(message, ...) do { \
if(!(__VA_ARGS__)) { \
/*error code*/ \
} \
} while(0)
特殊的预处理器变量 __VA_ARGS__
将扩展为在三个点的位置传递的任何内容,包括所有逗号。
请注意,预处理器至少不会解释条件中的逗号,它只会将它们按原样粘贴到 if()
语句中。如果您想传递模板化条件,这正是您想要的,正如评论所暗示的那样。
消息字符串中的逗号也不是问题,因为预处理器理解字符串文字并且不会解释双引号内的任何内容。
关于c++ - 支持逗号和错误信息的自定义 `assert`宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21957498/