什么时候断言变得多余?

时间:2014-01-28 03:04:27

标签: c++ assert

我正在为一个小项目编写一些碰撞检测代码,我将其用于矩形碰撞:

bool RectColl(const SDL_Rect *r1, const SDL_Rect *r2)
{
    assert(r1 != nullptr);
    assert(r2 != nullptr);
    // cool stuff here
}

这是像素完美的碰撞

bool PPColl(const SDL_Rect *r1, const SDL_Surface *s1, const SDL_Rect *r2, const SDL_Surface *s2)
{
    assert(r1 != nullptr);
    assert(r2 != nullptr);
    assert(s1 != nullptr);
    assert(s2 != nullptr);

    // Make sure that it's got rectangular collision
    if(!RectColl(r1, r2))
        return false;
    // more cool collision detection code here
}

正如你所看到的,当我打电话给PPColl时,我正在为r1和r2做两次断言。这是多余的,还是应该保留r1和r2的断言?

1 个答案:

答案 0 :(得分:3)

断言假设是多余的,因为它们应该检查代码确保的内容始终是真的。他们的目的是捕捉你认为总是正确但事实上是错误的事情。他们遇到的问题通常是由于未来对代码的更改而不是程序的当前状态。

在这种情况下,您的断言服务于不同的目的,并且应该保留。 PPColl中的那些正在检查 it 从未使用null参数调用。 RectColl中的那些与PPColl的论点无关;他们正在检查RectColl的论点。如果RectColl只调用PPColl,那么它们是相同的,因此它们已被检查过,但这是代码的属性;如果您删除了RectColl的断言,则可能无法捕获未来的错误,其中一些其他代码也会调用它,其参数可能为null,或者PPColl稍后更改为能够接受null指向某事物的指针,或任何其他可能的变化。