`
ihuashao
  • 浏览: 4550989 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

C++的可移植性和跨平台开发[3]:异常处理

阅读更多

  上一个帖子“语法”由于篇幅有限,没来得及聊异常,现在把和异常相关的部分单独拿出来说一下。<!--program-think-->

  ★小心new分配内存失败
  早期的老式编译器生成的代码,如果new失败会返回空指针。我当年用的Borland C++ 3.1似乎就是这样的,现在这种编译器应该不多见了。如果你目前用的编译器还有这种行为,那你就惨了。你可以考虑重载new操作符来抛出 bad_alloc异常,便于进行异常处理。
  稍微新式一点的编译器,就不是仅仅返回空指针了。当new操作符发现内存告急,按照标准的规定 (参见C++ 03标准18.4.2章节),它应该去调用new_handler函数(原型为typedef void (*new_handler)();)。标准建议new_handler函数干如下三件事:1、设法去多搞点内存来;2、抛出bad_alloc异常;3、调用abort()或者exit()退出进程。由于new_handler函数是可以被重新设置的(通过调用set_new_handler), 所以上述的行为它都可能有。
  综上所述,new分配内存失败,有可能三种可能:1、返回空指针;2、抛出异常;3、进程立即终止。如果你希望你的代码具有较好的移植性,你就得把这三种情况都考虑到。

  ★慎用异常规格
  异常规格在我看来不是一个好东西,不信可以去看看《C++ Coding Standards - 101 Rules, Guidelines & Best Practices》的第75条。(具体有哪些坏处以后专门开一个C++异常和错误处理的帖子来聊)言归正传,按照标准(参见03标准18.6.2章 节),如果一个函数抛到外面的异常没有包含在该函数的异常规范中,那么应该调用unexcepted()。但是并非所有编译器生成的代码都遵守标准(比如 某些版本的VC编译器)。如果你的需要支持的编译器在异常规范上的行为不一致,那就得考虑去掉异常规范声明。

  ★不要跨模块抛出异常
  此处说的模块是指动态库。如果你的程序包含有多个动态库,不要把异常抛到模块的导出函数之外。毕竟现在C++还没有ABI标准(估计将来也未必会有),跨模块抛出异常会有很多不可预料的行为。

  ★不要使用结构化异常处理(SEH)
  如果你从来没有听说过SEH,那就当我没说,跳过这段。如果你以前习惯于用SEH,在你打算写跨平台代码之前,要改掉这个习惯。包含有SEH的代码只能在Windows平台上编译通过,肯定无法跨平台的。

  ★关于catch(...)
  照理说,catch(...)语句只能够捕获C++的异常类型,对于访问违例、除零错等非C++异常是无能为力的。但是某些情况下(比如某些VC编译 器),诸如访问违例、除零错也可以被catch(...)捕获。所以,你如果希望代码移植性好,就不能在程序逻辑中依赖上述catch(...)的行为。

  下一个帖子,准备聊一下和“硬件有关的跨平台问题”。

http://program-think.blogspot.com/2009/01/cxx-cross-platform-develop-3-exception.html

分享到:
评论

相关推荐

    跨平台开发的一些资料合集

    包含: c++跨平台开发的一本书, MacOS开发3个PDF文档, Android开发36技, 开发可移植性软件常用方法一篇文章 ...

    Qt入门PPT跨平台开发案例总结

    Qt具有广泛适应性及良好的可移植性,编写过的C++语言代码,只需在其他不同的操作系统平台中重新编译一遍,即可重复使用。 编程平台包括Windows 98、Windows XP、Vista、Win8、Mac OS X、Linux Solaris、HP-UX以及...

    C++精华资料全集——云盘链接

    Dlib:使用契约式编程和现代C++科技设计的通用的跨平台的C++库。 EASTL :EA-STL公共部分。 ffead-cpp :企业应用程序开发框架。 Folly:由Facebook开发和使用的开源C++库。 JUCE :包罗万象的C++类库,用于开发跨...

    Qt步进电机上位机控制程序源代码Qt跨平台C C++语言编写 支持串口Tcp网口Udp网络三种端口类型 提供,提供详细注释和人工

    Qt步进电机上位机控制程序源代码Qt跨平台C C++语言编写 支持串口Tcp网口Udp网络三种端口类型 提供,提供详细注释和人工讲解 1.功能介绍: 可控制步进电机的上位机程序源代码,基于Qt库,采用C C++语言编写。 支持...

    C++单元测试三大框架的比较

    可移植性好(因其只需两个头文件,就可以完成测试工作);便于装卸;提供接口可以扩展其输出方式等。最大的优点:轻量级,便于装卸和可扩展其输出方式;缺点: C++单元测试三大框架的比较软件测试 1、TUT 结构框架简单...

    跨平台移动App开发引擎CrossApp v0.5.0

    CrossApp是一款完全免费、开源、跨平台的移动app开发引擎,由9秒技术团队负责更新和维护。CrossApp拥有跨平台、整合部分第三方库、基于基于OpenGL ES 2.0、丰富的UI控件、提供CrossApp配套编辑器,以及CrossApp ...

    poco c++ libraries_1.31

    POCO C++库是开源的用于简化和加速C++开发面向网络、可移植应用程序的C++库集,POCO库和C++标准库可以很好的集成并填补了C++标准库缺乏的功能空隙。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在...

    C++编写的贪吃蛇源代码【基于跨平台的QT4图形库】

    自己用C++编写的贪吃蛇源代码,基于跨平台的QT4图形库,支持windows和linux平台,移植性极佳!

    dlib-18.1 各种数据处理 学习的c++源代码

    Dlib是一个使用现代C++技术编写的跨平台的通用库,遵守Boost Software licence. 主要特点如下: 1.完善的文档:每个类每个函数都有详细的文档,并且提供了大量的示例代码,如果你发现文档描述不清晰或者没有文档,...

    01-JavaSE-JAVA运行原理.ppt

    有一个庞大的库,库中包含很多可重用的代码和提供安全性、可移植性以及可自动垃圾回收等服务的执行环境。 JAVA特点: 简单性:摒弃了C++中易引发错误的特性,如指针和内存管理; 面向对象性:支持代码继承及...

    C++开源程序库 C++开源程序库

    在目前的跨平台GUI框架中,Qt成熟度最高,已经被一些大公司应用在关键产品中。由于Trolltech对Qt采用的dual license模式,该产品既可以从开源社区获得支持,又能够赚取足够的商业利润,因此其前景也令人比较有信心。...

    qtopia移植技术文档.ppt

    主流嵌入式Linux下GUI解决方案 Qt Qt是Trolltech公司所开发的一个跨平台FrameWork环境 (一个运行的平台,有一堆常用的“库”) 多平台的C++图形用户界面应用程序框架 支持组件编程 (把系统分割成...较好的可移植性

    粘土游戏库

    写过游戏的人都有体会,写游戏是一个艰难的过程,但其实大部分时间是花在代码的重复...它的目标是简化游戏编程,实现游戏编程的可继承性和跨平台性。只要您熟悉C++,只需简单的使用所需的类,就能写出绘声绘色的游戏。

    C++入手项目(《C++语言程序设计》(第4版)课本项目).zip

    可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...

    Java 基础学习笔记:数据类型,常见运算,final &amp;amp; static,Java 常见类,异常 &amp;amp; 反射

    Java的可移植性使得它在各种设备和应用中得到广泛应用。它可以用于开发桌面应用程序、移动应用程序、Web应用程序、嵌入式系统等。由于Java的高性能和稳定性,许多大型企业和互联网公司选择使用Java开发核心业务系统...

    清华大学出版社《C++语言程序设计(第五版)》-郑莉 第3-12章全部课后习题参考答案.zip

    可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...

    C++语言程序设计课后作业.zip

    可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...

    高级语言程序设计C++,课程学习.zip

    可移植性好:C语言编写的程序可以在多种操作系统和硬件平台上运行,因此,学习C语言可以帮助学生掌握跨平台编程的技能,提高程序的可移植性。 效率高:C语言具有高效性,它可以直接访问硬件资源,执行效率高。在...

    牛客网BAT算法精品课练习题答案,包括JAVA和C++两个版本,代码中附上大量注释帮助理解程序.zip

    可移植性:Java字节码可以在所有安装了JVM的设备上执行,从服务器到嵌入式系统,再到移动设备和桌面应用。 健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能...

    javajava2级笔记

    java2级笔记 面向对象 java把所有的java... 可移植性 解释执行 多线程 解释执行 动态性 高性能 Applet的特点:嵌入HTML中,支持java的浏览器上运行 java与c++相比最突出的是跨平台性 不允许使用指针—健壮性

Global site tag (gtag.js) - Google Analytics