assert初探

C++ Reference中对assert函数的描述如下:

assert


If the argument expression of thismacro with functional form compares equal to zero (i.e., the expression isfalse), a message is written to the standard error device and abort is called, terminating theprogram execution.

The specifics of the message shown dependon the specific implementation in the compiler, but it shall include: the expressionwhose assertion failed, the name of the source file, and the line number whereit happened. A usual expression format is:

Assertionfailed: expression, file filename, line line number

This macro is disabled if at the moment ofincluding assert.h a macro with the name NDEBUG has already been defined. Thisallows for a coder to include many assert calls in a sourcecode while debugging the program and then disable all of them for theproduction version by simply including a line like:


at the beginning of its code, before the inclusionof assert.h.

 

assert


如果这个宏定义的expression参数与0相等(即这个表达式为假),一个出错消息将会写入到标准错误设备上,并且abort宏将会被执行以终止当前程序的运行。

消息的具体描述取决于特定编译器的实现,但是它一定会包括哪一个断言失效了、包含该断言的文件名以及断言所在的行号。通常消息的格式如下:

Assertionfailed: expression, file filename, line line number

如果程序中包含了assert.h的头文件并且一个名为NDEBUG的宏同时被定义,assert宏将会失效。这种机制可以使程序员在调试的时候使用许多assert宏,并能够在产品阶段简单的用如下的宏定义禁用掉这些assert宏:


这个定义需要写在包含assert.h的预处理指令之前。

 

网上有一大堆关于assert的使用方法,就不在累述了,不过有些准则需要重视的:

1.不能因为有了assert的存在而使程序的结构发生任何的改变,如果把assert部分删除了,程序依然不会有任何的问题,只不过不能帮助我们检查出一些错误来

2.一般来说,不要在expression中使用函数的返回值

3.不要将其使用在public函数中检查输入参数,但可以用于private函数中检测输入参数(不明白为什么,是不是public中使用出错处理?)

4.如果程序在assert处终止了,并不是说含有该assert的函数有错误,而是调用者出了差错,assert可以帮助我们找到发生错误的原因

5.使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并 且是一定要作出处理的

6.在函数的入口处,使用断言检查参数的有效性(合法性),注意是public

7.在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查

8.一般教科书都鼓励程序员们进行防错设计,但要记住这种编程风格可能会隐瞒错误。当进行防错设计时,如果“不可能发生”的事情的确发生了,则要使用断言进行报警

9.使用assert时候一定要写注释,要不然看不懂就麻烦了……

 


 




 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值