我一直在学习OpenCV教程,遇到了assert函数;它能做什么?
当前回答
assert computer语句类似于英语中的make sure语句。
其他回答
像“抛出异常”和“停止执行”这样的东西可能对大多数编译器是正确的,但不是所有的。(顺便问一下,真的有assert语句抛出异常吗?)
下面是c6x和其他TI编译器使用的assert的一个有趣的、略有不同的含义:在看到某些assert语句时,这些编译器使用该语句中的信息来执行某些优化。邪恶。
C语言示例:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
这告诉解编译器数组是在32位边界上对齐的,因此编译器可以生成针对这种对齐的特定指令。
此外,您还可以使用它来检查动态分配是否成功。
代码示例:
int ** p;
p = new int * [5]; // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
// array (size 3) of actual int values
}
assert (p); // Check the dynamic allocation.
类似于:
if (p == NULL) {
cout << "dynamic allocation failed" << endl;
exit(1);
}
使用assert()函数而不是普通的if else和printf有三个主要原因
assert() function is mainly used in the debugging phase, it is tedious to write if else with a printf statement everytime you want to test a condition which might not even make its way in the final code. In large software deployments , assert comes very handy where you can make the compiler ignore the assert statements using the NDEBUG macro defined before linking the header file for assert() function. assert() comes handy when you are designing a function or some code and want to get an idea as to what limits the code will and not work and finally include an if else for evaluating it basically playing with assumptions.
如果Assert的参数为假,Assert将终止程序(通常使用引用Assert语句的消息)。它通常在调试期间使用,以使程序在发生意外情况时更明显地失败。
例如:
assert(length >= 0); // die if length is negative.
你也可以添加一个信息更丰富的消息显示,如果它失败了,如下所示:
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
或者像这样:
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
在进行发布(非调试)构建时,还可以通过定义NDEBUG宏(通常带有编译器开关)来消除求值assert语句的开销。这样做的必然结果是,您的程序永远不应该依赖assert宏运行。
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
由于程序调用abort()并且不能保证执行任何操作,因此断言应该只用于测试开发人员假设的事情,而不是用于测试用户输入的数字而不是字母(这应该通过其他方式处理)。
看一看
assert() c++示例程序
Many compilers offer an assert() macro. The assert() macro returns TRUE if its parameter evaluates TRUE and takes some kind of action if it evaluates FALSE. Many compilers will abort the program on an assert() that fails; others will throw an exception One powerful feature of the assert() macro is that the preprocessor collapses it into no code at all if DEBUG is not defined. It is a great help during development, and when the final product ships there is no performance penalty nor increase in the size of the executable version of the program.
Eg
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3
推荐文章
- 为什么这个结合赋值和相等检查的if语句返回true?
- cplusplus.com给出的错误、误解或坏建议是什么?
- C多行宏:do/while(0) vs作用域块
- 找出质数最快的算法是什么?
- time_t最终的类型定义是什么?
- 我需要显式处理负数或零时,总和平方数字?
- c++枚举类可以有方法吗?
- 函数名周围的括号是什么意思?
- 用C语言创建自己的头文件
- 格式化IO函数(*printf / *scanf)中的转换说明符%i和%d之间的区别是什么?
- 将析构函数设为私有有什么用?
- main()中的Return语句vs exit()
- 为什么c#不提供c++风格的'friend'关键字?
- 如果不是内存地址,C指针到底是什么?
- 在函数的签名中添加关键字