8

C++ 的 assert 和编译参数

 3 years ago
source link: https://zhiqiang.org/coding/assert-in-cpp.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

C++ 的 assert 和编译参数

作者: 张志强

, 发表于 2020-10-26

, 共 876 字 , 共阅读 75 次

1)在函数开始处检验传入参数的合法性

int resetBufferSize(int nNewSize) { //功能:改变缓冲区大小, //参数:nNewSize 缓冲区新长度 //返回值:缓冲区当前长度 //说明:保持原信息内容不变 nNewSize<=0 表示清除缓冲区 assert(nNewSize >= 0); assert(nNewSize <= MAX_BUFFER_SIZE);

... } 2)每个 assert 只检验一个条件,因为同时检验多个条件时,如果断言失败,无法直观的判断是哪个条件失败

assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);      好:

assert(nOffset >= 0); assert(nOffset+nSize <= m_nInfomationSize); 3)不能使用改变环境的语句,因为 assert 只在 DEBUG 个生效,如果这么做,会使用程序在真正运行时遇到问题

错误: assert(i++ < 100)

这是因为如果出错,比如在执行之前 i=100,那么这条语句就不会执行,那么 i++这条命令就没有执行。

assert(i < 100) i++; 4)assert 和后面的语句应空一行,以形成逻辑和视觉上的一致感

以下是使用断言的几个原则:

( 1 )使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要作出处理的。 ( 2 )使用断言对函数的参数进行确认。 ( 3 )在编写函数时,要进行反复的考查,并且自问:"我打算做哪些假定?"一旦确定了的假定,就要使用断言对假定进行检查。 ( 4 )一般教科书都鼓励程序员们进行防错性的程序设计,但要记住这种编程风格会隐瞒错误。当进行防错性编程时,如果"不可能发生"的事情的确发生了,则要使用断言进行报警。

Q. E. D.

avatar-0.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK