c++ - 什么时候断言变得多余?

标签 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 的断言?

最佳答案

断言应该是多余的,因为它们应该检查您的代码确保始终为真的东西。他们的目的是捕捉那些你认为总是正确但实际上错误的东西。他们捕获的这类问题通常是 future 对代码进行更改的结果,而不是程序的当前状态。

在这种情况下,您的断言有不同的用途,应该全部保留。 PPColl 中的那些正在检查 从未使用空参数调用。 RectColl 中的参数与 PPColl 的参数无关;他们正在检查 RectColl 的参数。如果 RectColl 仅被 PPColl 调用,那么它们是同一件事,因此它们已经被检查过,但这是代码的属性现在;如果你删除了 RectColl 的断言,你可能无法捕捉到 future 的错误,在这种情况下,一些其他代码也使用可能为 null 的参数调用它,或者如果 PPColl 后来被更改能够接受空指针来表示某事,或任何其他可能的变化。

关于c++ - 什么时候断言变得多余?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21396056/

相关文章:

java - 我的团队不主张

java - 关于断言和异常; java

c++ - 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

c++ - RHEL 5.1 的 kcachegrind

c++ - 是否存在 self 分配有用的情况?

c++ - 将 assert() 与消息一起使用

assert - Microsoft Z3 命名断言

java - 不明确的方法调用 Assert 中的 assertEquals(Object, Object) 和 Assert 中的 assertEquals(double, double) 匹配 :

c++ - 标准中是否定义了可变参数模板包扩展的顺序?

c++ - C++设置唯一性和顺序