断言返回值,但以任何一种方式运行

时间:2013-12-17 20:15:51

标签: c++ coding-style compiler-warnings assert boolean-expression

通常,当我从集合中擦除元素时,我想断言它实际上已被删除: 即

assert(s.erase(e));

但是当设置NDEBUG时,元素不会被删除。但如果我写

bool removed = s.erase(e);
assert(removed);

编译器抱怨在设置NDEBUG时未使用'removed'。

我该怎么做?


我最后只是创建了一个实用工具方法:

inline void run_and_assert(bool b) {
    assert(b);
}

现在我可以说

run_and_assert(s.erase(e));

这有什么缺点吗?对我而言,这比luiscubal的解决方案更简单

2 个答案:

答案 0 :(得分:8)

第一个例子是错误的,因为在定义NDEBUG时将删除断言表达式,因此根本不会调用s.erase(e)

assert的论点不应该有副作用。

第二种方法更好,虽然警告可能确实很烦人,但是there are ways to silence the warning

或者,您可以提出自己的断言语句,该语句始终执行代码。

#ifdef NDEBUG
#define assert_always_execute(x) (x)
#else
#define assert_always_execute(x) assert(x)
#endif

答案 1 :(得分:0)

我写了自己喜欢luiscubal的建议,除了丑陋#define之外我做了一个简短的内联方法:

inline void assert_always_execute(bool x) {
    assert(x);
}