既然 assert
只是检查其参数中的语句是否成立,为什么我们不简单地使用 if
条件来检查呢?
Usage of assert
void print_number(int* somePtr) {
assert (somePtr !=NULL);
printf ("%d\n",*somePtr);
}
Usage of if
void print_number(int* somePtr) {
if (somePtr != NULL)
printf ("%d\n",*somePtr);
}
谁能指出两者之间的区别以及使用其中一种的优势?
此外,为什么大多数人在这里更喜欢 assert
而不是 if
?
断言不应该在正确的代码中触发。如果是这样,则您的代码中存在错误,需要修复。所以使用这样的函数:
void print_number(int* somePtr) {
assert (somePtr!=NULL);
printf ("%d\n",*somePtr);
}
您是说永远不应将空指针传递给此函数,如果是,则传递它的代码不正确。
但是,这里有你的功能:
void print_number(int* somePtr) {
if (somePtr != NULL)
printf ("%d\n",*somePtr);
}
你是说可以将一个空指针传递给这个函数,只是在那种情况下它什么都不做。
比较断言版本的更合适的函数是这样的:
void print_number(int* somePtr) {
if (somePtr == NULL)
std::abort();
printf ("%d\n",*somePtr);
}
这与 assert 做的事情本质上是一样的(尽管没有有用的诊断消息)。这里的区别在于,如果定义了 NDEBUG
,断言就会消失。此函数(带有 if, then abort)将在所有情况下进行检查。