MFC宏定义解析:异常处理与调试技巧
"MFC宏定义详解资源包含了对MFC框架中常用宏的详细解析,适合需要理解MFC宏用法的开发者学习。" 在MFC(Microsoft Foundation Classes)库中,宏是一种预处理器指令,用于简化代码编写,增强可读性和可维护性。以下是对几个关键MFC宏的解释: 1. **TRY/CATCH/AND_CATCH/THROW_LAST** 这些宏是MFC异常处理机制的一部分,它们提供了类似于C++标准异常处理的结构化方式。`TRY`块用于包围可能抛出异常的代码,`CATCH`捕获特定类型的异常,`AND_CATCH`允许捕获额外类型的异常。`THROW_LAST`则用于重新抛出最后一个被捕获的异常。 2. **ASSERT** `ASSERT`宏用于在调试模式下检查条件表达式的真伪。如果条件为假(即表达式结果为0),它会打印一条错误消息并中断程序执行。在发布版本中,`ASSERT`通常被优化掉,不会影响运行性能。 3. **VERIFY** `VERIFY`与`ASSERT`类似,也用于检查条件表达式,但它始终会执行表达式,无论是否在调试模式。这使得`VERIFY`可用于验证操作的结果,即使在发布版本中,结果也会被检查。如果表达式失败,`VERIFY`会在调试输出中报告,但不会停止程序执行。 4. **ASSERT_VAILD** `ASSERT_VAILD`用于验证对象的有效性,通常是确保指针指向的对象状态正常。在调试模式下,它调用对象的`AssertValid`成员函数(如果该对象类定义了这个函数),并在对象无效时发出警告。在发布版本中,这个宏的行为与`VERIFY`类似,仅检查而不中断程序。 5. **BEGIN_MESSAGE_MAP/END_MESSAGE_MAP** 这两个宏用于定义消息映射,这是MFC处理窗口消息的关键机制。`BEGIN_MESSAGE_MAP`声明消息映射的开始,指定类名和基类。`END_MESSAGE_MAP`表示结束。在它们之间,可以定义各种消息处理函数,如`ON_MESSAGE`, `ON_COMMAND`, `ON_BN_CLICKED`等,这些函数映射到特定的消息或事件。 6. **DEBUG_NEW** MFC中的`DEBUG_NEW`是`new`运算符的替代品,它在调试模式下添加了内存泄漏检测。当使用`DEBUG_NEW`分配内存时,MFC会记录分配信息,以便在程序退出时检查是否有未释放的内存。 7. **CATCH(..., exception_object_pointer_name)** 在异常处理中,`CATCH(exception_class, exception_object_pointer_name)`捕获指定类型的异常,并将异常对象赋值给`exception_object_pointer_name`。这样可以在异常处理代码中访问异常的属性和方法。 通过理解和正确使用这些MFC宏,开发者可以更有效地构建健壮、易于调试的MFC应用程序。宏的使用减少了重复代码,提高了代码的可读性和一致性,同时确保了在不同环境下的正确行为。
AND_CATCHAND_CATCH
AND_CATCH(exception_class,exception _object_point_name)
说明:
定义一个代码块,它用于获取废除当前TRY块中的附加异常类型。使用CATCH宏以获得一个异常类型,然后使用AND_CATCH宏获得随后的异常处理代码可以访问异常对象(若合适的话)已得到关于异常的特别原因的更多消息。在AND_CATCH块中调用THROW_LAST宏以便把处理过程移到下个外部异常框架。AND_CATCH可标记CATCH或AND_CATCH块的末尾。
注释:
AND_CATCH块被定义成为一个C++作用域(由花括号来描述)。若用户在此作用域定义变量,那么记住他们只在此作用域中可以访问。他也用于exception_object_pointer_name变量。
ASSERT
ASSERT(booleanExpression)
说明:
计算变量的值。如果结构的值为0,那么此宏便打印一个诊断消息并且成讯运行失败。如果条件为非0,那么什么也不做。 诊断消息的形式为: assertion failed in file in line 其中name是元文件名,num是源文件中运行失败的中断号。 在Release版中,ASSERT不计算表达式的值也就不中断程序。如果必须计算此表达式的值且不管环境如何那么用VERIFY代替ASSERT。
注释:
ASSERT只能在Debug版中用
ASSERT_VAILD
ASSERT_VAILD(pObject)
用于检测关于对象的内部状态的有效性。ASSERT_VALID调用此对象的AssertValid成员函数(把它们作为自己的变量来传递)。在Release版中ASSERT_VALID什么也不做。在DEBUG版中,他检查指针,以不同于NULL的方式进行检查,并调用对象自己的AssertValid成员函数。如果这些检测中有任何一个失败的话,那么他会以与ASSERT相同的方法显示一个警告的消息。
注释:
此函数只在DEBUG版中有效。
BEGIN_MESSAGE_MAP
BEGIN_MESSAGE_MAP(the class,baseclass)
说明:
使用BEGIN_MESSAGE_MAP开始用户消息映射的定义。在定义用户类函数的工具(.cpp)文件中,以BEGIN_MESSAGE_MAP宏开始消息映射,然后为每个消息处理函数增加宏项,接着以END_MESSAGE_MAP宏完成消息映射。
CATCH
CATCH(exception_class,exception_object_pointer_name)
说明:
使用此用定义一个代码块,此代码用来获取当前TRY块中都一个异常类型。异常处理代码可以访问异常对象,如何合适的话,就会得到关于异常的特殊原因的更多消息。调用THROW_LAST宏以把处理过程一下一个外部异常框架,如果exception-class是类CExceptioon,那么会获取所有异常类型。用户可以使用CObject::IsKindOf成员函数以确定那个特别异常被排除。一种获取异常的最好方式是使用顺序的AND_CATCH语句,每个带一个不同的异常类型。此异常类型的指针由宏定义,用户不必定义。
注释:
此CATCH块被定义作一个C++范围(由花括号描述)。如用户在此范围定义变量,那么它们只在吃范围内可以访问。他还可以用于异常对象的指针名。
DEBUG_NEW
剩余9页未读,继续阅读
- 粉丝: 3
- 资源: 32
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦