关于程序中的assert

来源:互联网 发布:刷recovery软件 编辑:程序博客网 时间:2024/06/05 23:16

 作者:  Crazii @ CSDN

摘自我的百度博客: http://hi.baidu.com/%CF%F4%CA%AE%C8%FD%C0%C9/blog/item/687d1af44fdbfbe67709d73b.html

assert在debug模式下是很有用的,可以比较方便的发现错误.assert是个宏,至于这个宏的定义可以去看看头文件了.
而在release版本下面,assert会被优化掉.所以这里需要注意assert的用法: 不要将同时具有功能性语句放在assert中,因为它在release下会被优化掉.

举个例子吧:
1.一个纯粹检查性的语句,非功能性的:
std::set<int> iset;
std::set<int>::iterator isetIter= iset.begin();
assert( isetIter != iset.end() ); //there's no problem when performing a check

2.功能性的检查语句:
1)
bool loadImage( std::string& filename);
assert( loadImage("testimage.img" ) ); //not only a check,but a funtionality with a result check.but in release mode,the whole funtionality would be striped off for optimization
2)
LPDIRECT3DDEVICE9 pDevice;//假设已经初始化
LPDIRECT3DTEXTURE9 pTexture;
assert( SUCCEEDED( D3DXCreateTextureFromFile(m_pDevice,"foobar.tga",&pTexture) ) );

当然在debug模式下,不会出现问题,但这正是应该注意的地方.assert会在release下被优化相信几乎所有人都知道.但是我曾经犯这个错误的时候,我也已经知道assert会被优化掉.
realse下的问题:
1.纯检查性的语句当然没有问题了.
2.带有功能性的,整个assert语句被优化掉.
所以对于2.1)来说,loadimage根本没有被执行.2.2)的D3DXCreateTextureFromFile 也没有被执行..问题就在这里.
所以正确的写法应该是:
1) bool ret = loadImage("testimage.img" );
asssert( ret ); //you better do it like this
2) HRESULT hres = D3DXCreateTextureFromFile(m_pDevice,"foobar.tga",&pTexture);
assert( SUCCEEDED(hres) ); //ha,this is the right way,only this one being stripped off in release mode.

原创粉丝点击