上一个帖子“语法”由于篇幅有限,没来得及聊异常,现在把和异常相关的部分单独拿出来说一下。<!--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++的可移植性和跨平台开发-编译器-操作系统-硬件体系 如果你平时使用C++进行开发,并且你对C++的可移植性问题不是非常清楚,那么我建议你看看这个系列。即使你目前没有跨平台开发的需要,了解可移植性方面的知识对...
《C++跨平台开发技术指南》是一本专注于C++语言跨平台开发的实用技术书籍。这本书详细介绍了C++在不同操作系统上,如Windows、Mac OS和Linux上开发应用程序的策略和实践。跨平台开发是软件开发领域中的一个重要方面...
C++标准库是跨平台开发的重要工具,因为它定义了一系列跨平台的接口,如输入输出流、字符串处理、容器和算法等。此外,第三方库如Boost、Qt等也为跨平台开发提供了丰富的功能,这些库通常经过了广泛的测试和优化,...
最终,本书的目标是使读者能够在掌握C/C++语言和跨平台开发工具的基础上,学会利用各种技术手段编写可在Windows、MacOSX、iOS、Android和Linux等主流平台上运行的跨平台程序。通过理论与实践相结合的方式,书中将...
C和C++是两种广泛用于跨平台开发的语言,因为它们具有高度的灵活性和广泛的可移植性。以下是对这两个主题的详细阐述: 一、跨平台软件开发 跨平台软件开发是指编写一次代码,然后能够在多种操作系统(如Windows、...
这些是进行跨平台开发的基础,因为它们确保代码的可移植性和复用性。 接下来,作者深入讨论了跨平台开发的关键问题,如处理操作系统差异、文件系统接口、线程与并发、网络编程以及图形用户界面(GUI)构建。在不同...
在跨平台开发方面,Qt4的移植性极强,其底层的QApplication和QWidget类能够适应多种操作系统,如Windows、Linux、macOS等。这使得开发者能够使用相同的设计模式和代码结构,实现一次编写,到处运行的目标。比如,...
使用Qt6和C++语言进行跨平台开发 在当下的软件开发领域,跨平台开发已经成为一个不可或缺的技术需求。作为一名软件开发者,我们需要能够在不同的操作系统上运行我们的应用程序,而不管是Windows、Linux还是Mac OS。...
跨平台开发的关键在于可移植性和抽象层。可移植性意味着编写的代码能够跨硬件和操作系统运行,而抽象层指的是将底层硬件和操作系统的细节抽象出来,使得程序开发人员不需要关注具体的平台差异,从而简化开发过程。 ...
从C++的基础到深入的MacOS和Android开发,再到实现软件可移植性的策略,每一个部分都对理解和掌握跨平台开发的核心概念至关重要。通过深入学习这些内容,开发者可以拓宽自己的视野,提高代码复用性,降低维护成本,...
在IT行业中,嵌入式系统和物联网(IoT)领域的发展日新月异,而“基于嵌入式Linux的具有可移植性的C++程序开发框架”正是这些领域的重要工具之一。 Embedme,作为这样一个框架,旨在简化Linux应用程序的开发过程,...
标题中的“纯标准c++实现的跨平台INI文件解析类”指的是使用纯C++语言编写的一个类库,它能够解析和操作INI配置文件,并且可以在多种操作系统上运行,体现出跨平台特性。INI文件是一种常见的轻量级配置文件格式,...
1. **使用标准化的C++库**:为了确保编写的程序具有良好的可移植性,应尽量使用C++标准库中的功能。避免使用平台特定的API或库,这样可以减少修改代码以适应不同平台的需要。 2. **配置跨平台的编译环境**:使用如...
标题 "C++跨平台开发库win32版" 指出这是一份适用于C++编程的跨平台开发库,特别针对Windows 32位环境进行了...使用这些库,开发者可以编写一次代码,然后在多种操作系统上运行,极大地提高了代码的可移植性和效率。
C++ Qt6 跨平台开发是一项重要的技术,它允许开发者使用C++语言构建可以在多个操作系统上运行的应用程序,包括Windows、Linux、macOS、Android以及iOS等。Qt库提供了丰富的功能,涵盖了图形用户界面(GUI)、网络...
- 在C++中,这样的库可以帮助开发者编写无需关心底层操作系统差异的代码,提高代码的可移植性。 4. **testthreadpool.cpp**: - 这个文件很可能是线程池的测试程序,用于验证`threadpool.c`和`threadpool.h`的...
- **跨平台库的使用**:为了确保程序的可移植性,本书推荐使用官方支持的跨平台库,如运行库和STL,以及准官方库如Boost。此外,还介绍了两个重要的开源库:SDL和gettext。 - **开源库的优势**:使用开源库可以避免...
对于跨平台开发,C++的标准模板库(STL)提供了大量可移植的数据结构和算法,极大地简化了跨平台编程的工作。 要进行跨平台软件开发,开发者需要了解每个目标平台的API和库。例如,在Windows上,我们可以使用...
3. **C++跨平台开发**:C++本身是跨平台的,但是不同操作系统上的API和库有所不同。使用像Qt这样的框架,开发者可以利用其提供的跨平台API,避免直接接触底层操作系统接口,简化了跨平台开发的复杂性。同时,通过...