关于assert(),不太明白,请指点。

shadowWind 2004-12-07 08:42:33
char *strcpy(char *strDest, const char *strSrc);
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ )
NULL ;
return address ;
}

我这样理解的:
在debug模式下运行时,如果strDest或strSrc为NULL,就会抛出异常。
可是release模式下,assert不起作用了了。如果strDest或strSrc为NULL,不是就没有进行参数错误处理了吗?
两种模式处理过程不一致,感觉不太对头。

哪位指点一下,我的理解有什么问题?

谢谢~
...全文
163 点赞 收藏 12
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
echoxue 2004-12-08
learn from
回复
armylau 2004-12-07
ASSERT用于, 假定调用这个函数时, 需要满足这个条件, 出现错误说明是调用者的参数不符合条件, 而不是被调用的函数本身的错误. -- 好像是高质量C++程序设计里说的
回复
wujian53 2004-12-07
第一 这不是异常, 准确的叫法是断言, 用于确定系统的状态;
也就是说断言肯定系统应该是什么状态;
char *p
assert(p);
也就是说断言肯定p 有效指针;

这才是assert的定义, 他们讲的是ASSERT是VC下的
assert是ANIS/ISO C 标准的

#undef assert

#ifdef NDEBUG

#define assert(exp) ((void)0)

#else

#ifdef __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _assert(void *, void *, unsigned);

#ifdef __cplusplus
}
#endif

#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )

#endif /* NDEBUG */


由于assert只在NDEBUG宏的作用下
如果你想在release下用, 有不像改程序
可以重新定义宏, 就照重写一边

#undef assert

#ifdef __cplusplus
extern "C" {
#endif

_CRTIMP void __cdecl _assert(void *, void *, unsigned);

#ifdef __cplusplus
}
#endif

#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, __LINE__), 0) )



回复
小李匪盗 2004-12-07
本来就是让你在DEBUG下使用的啊
回复
HunterForPig 2004-12-07
要是烦得话就自己判断
不过在调试程序是往往有些错误被我们忽略,
所以用编译器给你的指令,可以帮助我们更快的解决问题!
回复
EnochShen 2004-12-07
if((strDest!=NULL) && (strSrc !=NULL))
{
return NULL;
}
回复
oyljerry 2004-12-07
assert宏在debug中,verify在release中继续有效
回复
phineco 2004-12-07
楼上的说得很清楚,我就不多说了
回复
hongzm 2004-12-07
mark
回复
Kudeet 2004-12-07
ASSERT()是一个调试程序时经常使用的宏,在程序运行时它计算括号内的表达式,如果表达式为FALSE (0), 程序将报告错误,并终止执行。如果表达式不为0,则继续执行后面的语句。这个宏通常原来判断程序中是否出现了明显非法的数据,如果出现了终止程序以免导致严重后果,同时也便于查找错误。

ASSERT只有在Debug版本中才有效,如果编译为Release版本则被忽略。
如果ASSERT()中的条件不成立(比如 ASSERT(0) ; ),会弹出一个比较吓人的对话框。
点击重试,可以到达 ASSERT 断言不成立的那一行,
此时可以在watch窗口查看变量值,找出出错的原因。
如果程序能够继续运行,可以按F5继续调试。
回复
Semigod 2004-12-07
如果想在release时也检查,就用 VERIFY
回复
handwolf 2004-12-07

我把源代码给你看看,就是这样定义ASSERT的,所以出现你说的情况!
/////////////////////////////////////////////////

#ifdef _DEBUG
#define ASSERT(f) \
do \
{ \
if (!(f) && AfxAssertFailedLine(THIS_FILE, __LINE__)) \
AfxDebugBreak(); \
} while (0) \

#else // _DEBUG

#define ASSERT(f) ((void)0)
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-12-07 08:42
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……