Alexandrescus聪明地断言有回报价值

时间:2011-03-31 20:10:28

标签: c++ macros

我使用Andrei Alexandrescus智能断言技术作为我的断言设施,基本上接口是:

ASSERT( foo == bar, "Foo doesn't equal bar!" )( foo )( bar );

事实证明,通常当断言不成立时,想要提前退出,这导致我发生以下过​​载:

ASSERT( foo == bar, "Foo doesn't equal bar!", 0 )( foo )( bar )

遗憾的是,这个基于的递归宏技巧的一个限制是宏必须以另一个宏结束,它将所​​有内容都转换为齿轮,这导致我使用以下代码来支持返回值:

#define ASSERT3( expr, msg, ret ) \  
    if( (expr) ); \  
    else \  
    return ret + MakeAssert().AddContext( #expr, msg, BOOST_CURRENT_FUNCTION, __FILE__, __LINE__ ).SMART_ASSERT_A 

通过为operator+()类重载Assert,这很好用,但这是我目前面临的问题和解决方法:此方法不能用于返回{{1 ,构造函数或析构函数。

1 个答案:

答案 0 :(得分:0)

虽然不是很令人满意,但我发布这个以防这可能是一个暗示 为你:

#define ASSERT3( expr, msg, ret, ... )                                  \
    if( (expr) );                                                       \
    else {                                                              \
        MakeAssert().AddContext(....).SMART_ASSERT_A __VA_ARGS__;       \
        return ret;                                                     \
    }

ASSERT3( foo == bar, "...", 0, ( foo )( bar ) ) // usage