自定义`assert`宏,支持逗号和错误消息

Vit*_*meo 5 c++ macros assert c++11

我想创建在中定义的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
Run Code Online (Sandbox Code Playgroud)

如何正确实现一个自定义断言,该自定义断言将布尔表达式(可能带有逗号)作为第一个参数,并将字符串表达式(可能带有逗号)作为第二个参数?

还是有一种不使用宏来实现断言的方法?

cma*_*ter 4

你已经非常接近了,你需要使用的只是这样:

#define myAssert(message, ...) do { \
    if(!(__VA_ARGS__)) { \
        /*error code*/ \
    } \
} while(0)
Run Code Online (Sandbox Code Playgroud)

特殊的预处理器变量__VA_ARGS__将扩展到在三个点的位置传递的任何内容,包括所有逗号。

请注意,预处理器至少不会解释条件中的逗号,它只会将它们按原样粘贴到语句中if()。如果您想传递模板化条件,这正是您想要的,正如注释所暗示的那样。

消息字符串中的逗号也不是问题,因为预处理器理解字符串文字并且不会解释双引号内的任何内容。