断言的强大怎么高估都不过分。可以把assert 看成一个在任何系统状态下都可以安全使用的无害测试手段。
在MFC中为ASSERT宏。
用法: assert (表达式); assert会检查表达式的结果,如果表达式不成立会中止程序弹出一个对话框,提示断言错误的位置,点击重试按钮会进入程序中断言的位置。
断言一般只会在调试模式下生成代码(在NDEBUG宏没有被定义时),在发行版本中它们是不存在的。所以尽管用ASSERT进行检查好了。
断言使用的原则:
1. 不要在assert语句中编写有副作用的表达式,如:
assert ( ++ i<limit ) //糟糕:i在调试模式下才递增
2. 避免使用assert(false),应该使用assert(“informatonal message”); 大多数编译器会在错误输出设备中发送这个字符串,这样可以取代注释,如:
assert(month> 0 && monnth < 13 && "月份不在范围之内!");
3. 不要使用断言报告运行时的错误,如:不要用assert确保malloc成功执行,窗口成功创建或者线程成功启动等。但是可以用assert确保API函数的执行符合文档的记载。总而言之:我们知道有些错误是可能会发生的,有些是错误是不应该发生的是非法的。前者大多为运行时错误可以用异常解决。后者发生了就是程序员的过错,此时就应该使用assert。
4. 在函数的开始处检验传入参数的合法性。在此处不要使用条件过滤来检查传入参数。传入参数不合法是不应该发生的行为是调用者的错误,使用断言能很好的发现错误。
5. 每个assert应该只检验一个条件,因为同时检验多个条件时,如果断言失败,无法观的的判断是哪个条件失败。
总结:使用assert就是防止“非法的”错误发生,杜绝你认为“不可能发生”的错误发生。