【讨论】关于ASSERT断言,我从不使用。
rabo 2007-03-02 02:54:10 ASSERT也许是一个很好的东西,断言一个必须成立的值。
但是我从来没有使用过,而是一直使用“老套”的返回值的方法,原因有以下几点:
1. ASSERT不能保证release下不出问题。
一个程序,里面可能会有各种各样的错误,一个十全十美的应用程序,是不可能的,毕竟人不是机器。这个时候,微软就提供了一个叫ASSERT的宏来判断一个值是否为假,并且在MFC源代码里面大肆狂用。这个宏很不错,让大家在DEBUG下能判断出假值。但是release下就判断不了了,当然你可以使用assert()函数,不过我们只讨论ASSERT宏。
有人说,只要DEBUG下断言成功了,RELEASE下就不会出错了。我们仅仅是希望如此而已。举一个例证明一下,内存溢出是所有会写代码的人都会遇到过的问题。你断言成功了,并不代表你内存不会溢出。这时,内存被踩了,谁都无法辨认,当然ASSERT它也不能。这个时候你的程序会继续向下执行,可能在很久之后才会出现错误。这无疑对你查找溢出点增加了很多难度。
如果你不是断言,而是使用的错误判断,很可能就在那一行代码就是查出错误,因为断言只能判断真假,而你的错误判断可以五花八门千变万化,并以错误码返回。当然可能有朋友会说这样会浪费性能,是,不过我更愿意些。
如果要继续举例,可以举出很多来。
2. 使用ASSERT提供的接口,我向来认为不好。
为什么要写这篇讨论,是因为我在网上看到了一们兄台的BLOG,其中有对ASSERT的讨论。http://www.cppblog.com/darkdestiny/archive/2006/07/15/10101.aspx其中有一段话让我想写这篇贴子。“因为我们写函数(接口)的目的,是希望能被正确的调用,而不是胡乱(导致局部或者整体状态混乱)的使用(为此我们居然要将assert写成错误处理的形式,以容忍各种白痴的调用行为).”
我不这样认为,我认为一个接口的提供者应该考虑到各种情况并且能够适应各种情况,这样的接口才是一个优秀的接口,也就是说随便你怎么折磨它都行。当然一个优秀的程序员,是应该仔细按照文档来编写代码,但是谁也不想一运行程序就“当”的一下弹出来错误吧。如果是MFC,至少还有代码可供你参考,你的接口如果没有代码,那别人很难知道是什么错误,因为ASSERT错误不会告诉什么值错了。更不用说RELASE版了,程序运行后会发生什么事,没人能知道。
这个时候如果你有错误返回值,那这一切都完美的解决了。开发人员可以一看返回值就知道是出了什么错误,这样多好,至少我这样觉得。
3. 目前看来,没有什么程序是必须必须要执行下去,而不能返回的。
ASSERT的作用就是在DEBUG里面帮你判断,RELASE里面不管你,也就是在DEBUG里面,值一定要正确,然后执行下去,RELEASE里面无论有不有值程序都将执行下去。我想,应该不会有什么函数是要求不管有不有错误都必须执行下去吧。难道就不能给出一个返回值来告诉作者哪里出错了吗?
在此我置疑MFC里面那大篇大篇的ASSERT。
4. 上面的都是我的一些看法和观点,可以比较狭隘和偏执。希望大家热烈讨论,如果觉得我不对,请说出使用它的理由来,并举例说明,谢谢。我也很希望知道是我自己错了,一般还是不要怀疑微软的东西比较好。