根据语言的不同,断言行为会有所不同。在C语言中,它们经常被错误地使用,不正确的用法很常见,许多人建议不要使用它们。它们不应该用于生产(即,C的生产编译应该为预处理器定义NDEBUG
),因为它们仅用于减慢执行速度。
断言的目的是声明一个逻辑必要性,而不是检查结果。例如,它是正确的(C语言)来写:
f = malloc(s);
if(f == NULL) {
...; exit(1);
}
assert(f != NULL); # This is logically necessary.
但是完全错误永远写:
f = malloc(x); # THIS IS AN EXAMPLE OF INCORRECT USAGE
assert(f != NULL); # DO NOT DO THIS
这是真正有用的,因为它是完全有效的写:
f = xmalloc(x);
assert(f != NULL);
这对读者来说是一个文档,xmalloc的定义方式是永不返回空值。
它们通常用于在函数的开始:
void f(void *p) { assert(p != NULL); ... }
这种用法是不一个错误检查。而是用来表示函数f
期望它永远不会传递空指针。这是向开发人员传递空指针f
的文档是编程错误。使它成为断言可以在启用断言时在运行时检测到错误。
我猜在使用断言时,C和Java有一些差异。它也在该文档页面中说过“不要在公共方法中使用断言进行参数检查”。 – 2013-02-20 17:07:14