VC 中用于调试程序的宏
ASSERT() ASSERT()被测试它的参数,若参数为 0,则中断执行并打印一段说明消息。在 Release 版本的程序 中它不起任何作用。ASSERT()使用的时候必须保证参数表达式中不能有函数调用(译者注:ASSERT() 宏在 Release 版本中不对表达式求值) 因此对于任何有函数调用的参数表达式, , 应该使用宏 VERIFY(), 以保证表达式中的函数调用在 Release 版本中会被正确求值。 断言(assertion)用带断言信息(
程序, 模块, assertion 行)的对话框执行. 对话框有 3 个按钮: "Break", "Repeat" ("Debug"), and "Continue" ("Ignore"). "Break" 结束程序, "Continue" 忽略断言, 最有 用的是"Repeat"按钮. 按下它在断言的地方打开
源代码编辑器. 在这里你可以测试所有的变量值并明白 哪里出了问题。 例如:ASSERT(pPointer);ASSERT(n>0 &;&; n<100);ASSERT(0); ASSERT 在执行简单验证时很有用,但对于 C++对象,特别是由 CObject 派生的对象,则有更好的方法 ASSERT_VALID 来实现类似操作。作为一般规则,我们应在开始使用每一个对象之前检查数据讹误, ASSERT_VALID 宏使得对 CObject 的派生类实现该操作非常简单。 例如:ASSERT_VALID(this);ASSERT_VALID(pView); VERIFY() VERIFY()和 ASSERT()很相似,区别在于在 Release 版本中它仍然有效(译者注:原作者在这里没 有讲清楚,VERIFY()不会打印说明,只是会对参数表达式求值)。 TRACE() TRACE()基本上就是函数 printf()的一个复制品,唯一的区别是它把结果输出到调试窗口。在 Release 版本中,它也是无效的。一般是用 TRACE0(),TRACE1(),TRACE2()…而不用 TRACE()。 这三个宏在? Release 版本中都不会产生任何实质性的影响, 它们是否起作用取决于是否定义了预定义了 宏 _DEBUG。这是对 Microsoft Visual C++ 而言,在其它的编译器中可能其它不同的宏。 常用用法:
常用用法: 为了控制传进的指针: void SomeFun(SomeType* pPointer) { ASSERT(pPointer); //some instructions. } 你可以在"switch" 和 "if"操作中捕获奇怪的值 例如: switch(nRGBColors){ case nRed: {//some instructions.} break; case nGreen: {//some instructions.} break; case nBlue: {//some instructions.} break; default: ASSERT(0); } if(nWaterTemp >=0 &;&; nWaterTemp < 50){ //some instructions. // we should have never come here!
} else if(nWaterTemp >= 50 &;&; nWaterTemp <= 100){ //some instructions. } else{ ASSERT(0); } 对值的断言: ASSERT(nSomeValue >= MinValue and nSomeValue <= MaxValue); ASSERT(nOtherValue != 0); 可爱的 ASSERT 错误 ASSERT( m_MyWnd.Create() ); 呕! 这是一个可怕的错误! 程序在调试版中正常工作, 在发行版中不
工作. 记住: 这是一个在发行版中将 被移除的宏. 以这种方法你的窗口将永远不会被创建. 如果你用 MFC, 这样做: VERIFY( m_MyWnd.Create() ); // we should have never come here!
它在调试版中像 ASSERT 一样并且在发行版中执行 m_MyWnd.Create()。
1)指向常量的指针变量 指向常量的指针变量 指针本身的内容可改变,但不会通过该指针改变所指向的内容。例如: const int MAX=3; const int * iPointer = &;MAX; iPointer = new int; 是合法的。 *iPointer=2;//非法 *iPointer += 3;//非法,它不可以改变指针所指向的内容。 应该明确,指向常量的指针是可以指向变量的。下列语句成立: int k=5; const int * iPointer = &;k;
2)指向变量的指针常量 (类似引用) 指向变量的指针常量 类似引用) 指针本身不会在运行时改变,但是指向内容可以改变。例如: int size = 5; int * const iConstPointer = &;size; //指针常量必须在定义的时候初始化确定它的指(内容) iConstPointer = new int;//非法 (* iConstPointer)++;//合法
3) 指向常量的指