assert的用法简介
来源:互联网 发布:女生基本款 知乎 编辑:程序博客网 时间:2024/06/05 00:41
C++ assert()函数原型及介绍如下:
C++0x中引入了static_assert这个关键字,用来做编译期间的断言,因此叫做静态断言。
其语法很简单:static_assert(常量表达式,提示字符串)。
如果第一个参数常量表达式的值为真(true或者非零值),那么static_assert不做任何事情,就像它不存在一样,否则会产生一条编译错误,错误位置就是该static_assert语句所在行,错误提示就是第二个参数提示字符串。
说明
使用static_assert,我们可以在编译期间发现更多的错误,用编译器来强制保证一些契约,并帮助我们改善编译信息的可读性,尤其是用于模板的时候。
static_assert可以用在全局作用域中,命名空间中,类作用域中,函数作用域中,几乎可以不受限制的使用。
编译器在遇到一个static_assert语句时,通常立刻将其第一个参数作为常量表达式进行演算,但如果该常量表达式依赖于某些模板参数,则延迟到模板实例化时再进行演算,这就让检查模板参数成为了可能
例子:
#include < assert.h>
void
assert
(
int
expression );
功 能: 测试一个条件并可能使程序终止.
C++ assert()函数的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。使用C++ assert()函数的缺点是,频繁的调用会极大的影响程序的性能,增加额外的开销。在调试结束后,可以通过在包含#include < assert.h>的语句之前插入 #define NDEBUG 来禁用assert调用,示例代码如下:
#include < stdio.h>
#define NDEBUG
#include < assert.h>
用法总结与注意事项:
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和后面的语句应空一行,以形成逻辑和视觉上的一致感
5)有的地方,assert不能代替条件过滤。
- assert的用法简介
- Java Assert 用法简介
- 有关assert的用法
- ASSERT的用法
- ASSERT的用法
- 断言ASSERT的用法
- assert的多种用法
- assert()断言的用法
- assert的用法
- ASSERT()的用法
- assert的用法
- assert() 断言的用法
- assert的用法总结
- assert()的用法
- assert的用法
- assert的用法
- 断言(ASSERT)的用法
- assert 的用法
- Java - PAT - 1014. 福尔摩斯的约会 (20)
- Spring事务不回滚
- C++第13周项目 多态性 【项目3-形状类族的中的纯虚函数】
- 函数的调用规则(__cdecl,__stdcall,__fastcall,__pascal)
- 动态规划 problem L
- assert的用法简介
- OpenGL像素默认像素存储格式
- Python 修改文件重命名代码
- Java千百问_06数据结构(021)_StringBuffer/StringBuilder有什么区别
- struts2:This method: login for action user is not allowed!
- C++第13周项目 多态性 【项目4-立体类族共有的抽象类】
- Android中InstanceState()使用详解
- ZOJ2314Reactor Cooling(无源汇上下界可行流)
- 为什么你有10年经验,但成不了专家?