c++ - 支持逗号和错误信息的自定义 `assert`宏

标签 c++ c++11 macros assert

我想创建一个自定义版本的 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/

相关文章:

scala - 从函数的返回值中提取符号

c++ - 错误C2137 : Empty character constant in c++

c++ - 何时在 C++ 中创建 vtable?

c++ - 如何对不同的静态类进行分组?

c++ - 如何检测显式转换运算符,is_constructible 应该工作吗?

c++ - 排序函数如何作用于一对整数对的 vector ?

scala - 宏采用类主体,消除显式新运算符?

c++ - 宏 : How do I change each value in __VA_ARGS__

c++ - 信号处理(SIGFPE)

c++ - 如何降低C/C++中的线程优先级