一下文章来源网络,版权归原作者所有。
assert()是C语言标准库中提供的一个通用的预处理器宏,在代码中常用assret()来判断一个必须的前提条件,以便程序能够正确执行。使用assert()必须包含的头文件是#include <assert.h>
如果assert(条件),中的条件为假,则程序输出诊断消息,然后终止。
因此,assert只是帮你检查文件是否被打开,如果没有被打开,就会中止,不会向下执行。
准确的说,assert函数并不是C++的东西,而是C的一个宏,你打开assert.h文件就能看到assert的定义,它里面的参数是一个表达式,如果为真则不会进行处理,如果为假就进行一些处理,这个不同的编译器的宏是不一样的,而且甚至你可以自己定义自己的assert宏。有的编译器的定义会打出当前的行号和文件名,然后core掉当前程序。比如这样:
- int a = 10;
- assert(1 == a/10);
- cout << a << endl;
如果程序执行到assert发现条件不满足,就会打印当前行号,文件名并core掉当前程序。不过我们可以自己定义assert宏来满足自己的要求,不一定是core掉当前函数。
一般使用的时候都会加一个DEBUG宏定义来确定assert是否生效所以一般assert的定义是这样的:
- 代码:
- #ifdef NDEBUG//这里NDEBUG是判断是否定义了DEBUG编译器自动定义的
- # define assert(expr) (__ASSERT_VOID_CAST (0))//这一句的意思就是让assert不做任何事情
- #else
- # define assert(expr) /
- (__ASSERT_VOID_CAST ((expr) ? 0 : /
- (__assert_fail (__STRING(expr), __FILE__, __LINE__, /
- __ASSERT_FUNCTION), 0)))
这里大量用到了宏定义,不过大概意思能看懂吧,如果没有定义DEBUG,把assert定义为空,否则判断assert的表达式是否为0,是则运行__assert_fail,否就再次把assert视为空(__ASSERT_FUNCTION), 0)。
以上是linux里面的定义,其他系统也大同小异,如果自己定义assert的话,就不用include assert.h了,而且也不一定要core掉自己的程序。
不过作为一种调试方式,在c++里面更倾向于使用异常来进行错误处理。