C语言程序开发中常用的assert,到底有什么用,有哪些好处?

有经验的C语言程序员常用的assert,到底有什么用,有哪些好处?C语言程序开发中常用的assert,到底有什么用,有哪些好处?

相信不少初学者在阅读一些开源的C语言项目时,都会看到 assert 关键字,那么它有什么用呢,又有哪些好处呢?

C语言程序开发中常用的assert,到底有什么用,有哪些好处?

assert 关键字,什么时候使用它?

assert 关键字,什么时候使用它?

C语言中的 assert() 方法可以诊断程序 bug,使用之前应该包含 <assert.h> 头文件,它的C语言原型如下,请看:

void assert(int expression);

参数 expression 可以是任意C语言表达式。如果表达式的计算结果为真,assert() 不执行任何操作,反之,如果表达式的计算结果为假,assert() 将在 stderr 上显示错误信息并且终止程序运行。

assert() 一般用于跟踪C语言程序的运行时(与编译时不同)错误,一般这样的错误不是语法错误,所以能够编译通过,但是最终得到的C语言程序在执行时,可能会给出不预期的错误结果。

C语言程序开发中常用的assert,到底有什么用,有哪些好处?

可能会给出不预期的错误结果

例如,某段分析财务信息的C语言程序出错了,可能是因为程序中的利率变量 interest_rate 为负导致的,利率是不可能为负的,所以在这样的一段C语言程序中,可以添加如下语句:

assert(interest_rate>=0);

这样一旦出现利率为负的情况,assert() 将(以异常方式)终止程序,并给出错误信息,这样一来,我们就可以根据错误信息排查代码了。例如下面这段C语言程序:

#include <stdio.h>
#include <assert.h>
int main()
{
 double interest_rate = -1;
 assert(interest_rate>=0);
 printf("won't be here\n");
 return 0;
}
C语言程序开发中常用的assert,到底有什么用,有哪些好处?

可以根据错误信息排查代码

编译并执行这段C语言代码,得到如下输出:

# gcc t.c
# ./a.out 
a.out: t.c:7: main: Assertion `interest_rate>=0' failed.
Aborted

显然,当 interest_rate 为负数时,assert(interest_rate>=0); 将提前(以异常方式)终止程序运行,并给出错误的原因。与此同时,后续的C语言代码将不再有执行机会。

其他

C语言中的 assert() 还有个方便点在于,程序员一旦开发程序完毕,可以在 release 版本程序中关闭 assert() 宏,此时 assert() 宏将不再提供功能,它在程序中的作用等同于一个空格。这一点可以直接查看 <assert.h> 头文件:

C语言程序开发中常用的assert,到底有什么用,有哪些好处?

<assert.h> 头文件

显然,通过 NDEBUG 宏就能控制 assert() 方法的开关了。下面是一个例子:

#include <stdio.h>
#define NDEBUG
#include <assert.h>
int main()
{
 double interest_rate = -1;
 assert(interest_rate>=0);
 printf("won't be here\n");
 return 0;
}
C语言程序开发中常用的assert,到底有什么用,有哪些好处?

例子

编译并执行这段C语言代码,可以得到如下输出:

# gcc t.c
# ./a.out 
won't be here

可见,assert() 被关闭了。另外,如果 assert() 失败时,添加一些附加错误提示信息,可以使用“短路表达式”(可参考我之前的文章:硬件有短路电路,C语言程序开发中有“短路表达式”你知道吗?)的技巧:

#include <stdio.h>
#include <assert.h>
int main()
{
 double interest_rate = -1;
 assert(interest_rate>=0 && "interest rate cannot be negtive!" );
 printf("won't be here\n");
 return 0;
}
C语言程序开发中常用的assert,到底有什么用,有哪些好处?

可以使用“短路表达式”的技巧

字符串”interest rate cannot be negtive!”必定为真,因此决定 assert() 是否失败的因素仍然在于 interest_rate>=0 本身,编译并执行上述C语言代码,得到如下输出:

# gcc t.c
# ./a.out 
a.out: t.c:7: main: Assertion `interest_rate>=0 && "interest rate cannot be negtive!"' failed.
Aborted

小结

本节主要讨论了C语言程序开发中 assert() 宏的使用,它可以在程序开发阶段,帮助程序员定位到一些本不应该发生的情况。更加方便的是,一旦程序开发完毕,程序员可以简单的通过 NDEBUG 宏关闭 assert() 的功能,此时它就等同于一个空格,不会为程序带来任何性能损失。

C语言程序开发中常用的assert,到底有什么用,有哪些好处?

点个赞再走吧

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

未经许可,禁止转载。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/82477.html

(0)
上一篇 2024-09-11 05:31
下一篇 2024-09-11 18:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信