拜读朱敏娜老师等编写的书籍,觉得很有用,总结一下。详细的操作还要再研究。
Visual C++提供的用于调试的宏有ASSERT、ASSERT_KINDOF、 ASSERT_VALID、 DEBUG_NEW 、 TRACE 、 VERIFY。
1.ASSERT和ASSERT_VALID宏
在调试时,可以利用宏ASSERT和ASSERT_VALID来设定断言。
宏ASSERT的原型如下:
ASSERT(Boolean Expression);
参数Expression是一个逻辑表达式。在程序运行过程中,若逻辑表达式为TRUE,则一切运行正常。若该表达式的值为FALSE,程序会停止运行并且系统会弹出一个警告对话框。
在警告对话框中提示了程序错误所在,并且终止、重试和忽略3个按钮提示。若选择终止按钮,系统将停止程序的调试进程。若选择重试按钮,系统将调用函数AfxDebugBreak(),并激活调试器,显示出断言失败的代码。若选择忽略按钮,系统将会忽略该错误,继续运行程序。ASSERT宏只在Debug模式下起作用,在Release模式下将被忽略。
宏ASSERT_VALID可用来确认CObject的派生类对象是否是有效对象:
原型如下:ASSERT_VALID(pObject);
参数pObject是一个对象指针。ASSERT_VALID在release模式下不起作用,在debug模式下,如果对象指针为NULL,vc++会调用对象其成员函数AssertValid()检测。当所有的检测都失败了,将会弹出和ASSERT一样的警告对话框。
2.TRACE宏
TRACE宏用于程序在DEBUG模式下运行,输出一些调试信息,使用方法类似于C的prinf函数。开发人员可以在程序不同地方添加TRACE宏,从而了解程序的一些运行状态,如某函数或代码有没有被执行。其具体应用如下:
int x=1;
int y=2;
float z=3.0;
TRACE("x=%d\n",x);
TRACE("x=%d and y=%d\n",x,y);
TRACE("x=%d and y=%d and z=%f\n",z,y,z);
当选择了debug目标,并且afxTraceEnable变量被置为TRUE时,TRACE宏也就随之被激活了。但在程序的Release版本中将完全被禁止。
3.VERIFY宏
原型如下:
VERIFY(Boolean Expression);
参数Expression是一个表达式货真指针。在Debug模式下,VERIFY宏检测其参数。当表达式的值为0时,终止程序运行并弹出“Debug Assertion Failed”对话框,给出诊断信息。如果表达式的值为非零,程序正常运行。
与其他宏不同的是,在RELEASE模式下,VERIFY宏仍然起作用。但当参数表达式的值为零时,并不弹出“Debug Assertion Failed”对话框,也不终止程序的运行。
在DEBUG模式下,用VERIFY宏来检测函数的返回值。如下代码所示:
HDC hdc;
VERIFY((hdc=::GetDC(NULL))!=NULL);
当GetDC(NULL)的返回值为NULL时,终止程序的运行并弹出“Debug Assertion Failed”对话框。