首页 技术 正文
技术 2022年11月13日
0 收藏 860 点赞 2,438 浏览 1300 个字

编写代码时,总会做出一些假设,断言就是用于在代码中捕捉这些假设,
可以将断言看成是异常处理的一种高级形式。
c语言assert宏的定义,
#include <assert.h>
void assert(int expression);
意思就是断言表达式expression为真。
如果expression表达式的结果为假,则向stderr打印出错信息并调用abort来终止程序运行。

#undef assert
#ifdef NDEBUG
#define assert(expression) ((void)0)
#else
#define _STR(x)  _VAL(x)
#define _VAL(x)  #x
#define assert(expression) ((expression)?(void)0:_assert(__FILE__ “:” _STR(__LINE__) ” ” #expression))
#endif

使用assert宏时应该要注意:assert只有在debug版本中才生效;在release版本中应该什么都不做。
所谓debug版本,就是程序员调试所使用的版本,这个版本会输出更多的日志信息以便于调试bug;
所谓release版本就是最终交付给客户或用户使用的版本。
通常在用户功能层面来看,debug版本和release版本应该是一样的;
但是release版本因为更高级的优化、更好的日志输出等,所以release版本的程序执行效率会更高。
所以通常使用类似于如下的方式来定义用户自己的assert宏,
#ifdef DEBUG
#define ASSERT(expression) xxx
#else
#define ASSERT(expression) ((void)0)
#endif

当我们认为某个表达式不可能为真的时候,就可以使用assert来判定。
assert可以用来检查指针的有效性、参数的合法性等。
使用assert可以帮助程序员在程序开发阶段就能够尽早的发现错误。

使用assert的一点主意事项:
expression应该足够简单,不要同时检查多个条件,
这样当assert失败时,可以明确的知道哪个条件失败了。

如果assert失败了呢?这个时候程序要怎么执行?
所以光有assert还不够,还要做好程序的出错处理,只有这样写出来的程序才是稳定的健壮的。

以下是一个简单的除法操作案例。
在除法操作中,必须要检查的一件事就是被除数不能为0,否则会发生算术错误。
使用assert,可以帮助程序员在debug版本中查到错误;
release版本中,除了要做被除数检查外,还要做好被除数为0时的出错处理。
因为y=0并不是预期的值,所以即使有了处理处理程序,仍然需要进一步查找y=0的原因。
只有找到了真正的错误根源,并且进行修复,才能进一步提高软件的品质。
int x = 100;
int y = 0;
int sum = 0;

y = get_devide();
assert(y != 0);
if (y != 0)
{
    sum = x / y;
}
else
{
    printf(“\nerror, y=0, please to check the reason”);
    do_error_handling();
}

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,078
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,553
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,402
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,177
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,814
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898