目前还有相当一部分开发人员在使用老式编译器干活,这些老式编译器可能对C++98支持不够。因此,当你的代码移植到这些老式的编译器上时,可能会碰到一些稀奇古怪的问题(包括编译出错和运行时错误)。下面这些注意事项有助于你绕过这些问题。
强调一下,后面提到的好几个条款都是通过回避C++的新语法来保证移植性。如果你用的是新式编译器,那么你可以不理会这些条款。<!--program-think-->
★小心for循环变量的作用域(不支持新标准)
在C++98标准中,for循环变量的作用域局限在循环体内。而某些老的编译器(例如Visual C++ 6)认为for循环变量的作用域在循环体外。所以如下的代码可能导致移植问题。
{
for(int i=0; i<XX; i++)
{
// ...
}
for(int i=0; i<XXX; i++)
{
// ...
}
}
建议修改为不同的循环变量,如下所示:
{
for(int i=0; i<XX; i++)
{
// ...
}
for(int j=0; j<XXX; j++)
{
// ...
}
}
★不要使用全局类对象,改用单键(标准未定义)
全局类对象的构造函数先于main()函数执行,如果某个模块中同时包含若干个全局类对象,则它们的构造函数的调用顺序是不确定的。而单键是在第一次调用时被初始化,能避免此问题。另外,单键虽然解决了构造问题,但是析构依然有隐患。详见“C++ 对象是怎么死的?进程篇”。
★保持inline函数尽量简单
不要在inline函数内部使用局部静态变量,不要在inline函数使用可变参数。这些都有可能导致移植问题。
★不要依赖函数参数的求值顺序(标准未定义)
标准没有明确规定函数参数的求值顺序。因此,如下的代码行为是不确定的。
void Foo(int a, int b);
int n = 1;
foo(++n, ++n);
★慎用模板特化(不支持新标准)
有些老式编译器对偏特化或全特化支持不够。
★模板继承中,引用基类成员要小心(不支持新标准)
看如下例子:
template <typename T>
class TBase
{
protected:
typedef std::vector<T> Container;
Container m_container;
};
template <typename T>
class TDerived : public TBase<T>
{
typedef TBase<T> BaseClass;
public:
void Func()
{
typename BaseClass::Container foo; //可移植
Container foo; //不可移植
this->m_container.clear(); //可移植
m_container.clear(); //不可移植
}
};
★慎用RTTI(不支持新标准、标准未定义)
先声明一下,我这里说的RTTI主要是指typeid操作符和type_info类型。
首先,由于某些老式编译器可能不支持typeid操作符和type_info类型,会导致移植性的问题,这是慎用RTTI的一个原因。(如果你用的是新式编译器,不用考虑这个因素)
其次,由于标准对于type_info类型的约束比较简单。这导致了不同的编译器对type_info的实现有较大差异。如果你确实要使用type_info类型,建议仅仅使用它的operator==和operator!=这两个成员函数。
所以,如果你确实需要在运行时确定类型,又不想碰到上述问题,可以考虑在自己的类体系中加入类型信息来实现。比如MFC和wxWidgets都是这么干的。
★慎用嵌套类(不支持新标准)
如果在内部类访问外部类的非公有成员,要把内部类声明为外部类的friend。
如下代码存在移植问题。
class COuter
{
private:
char* m_name;
public:
class CInner
{
void Print(COuter* outer)
{
cout << outer->m_name;
}
};
};
应该改为如下代码
class COuter
{
private:
char* m_name;
public:
class CInner; //前置声明
friend class CInner;
class CInner
{
void Print(COuter* outer)
{
cout << outer->m_name;
}
};
};
★不要定义参数类型相近的函数(标准未定义)
void Foo(short n);
void Foo(long n);
Foo(0); //会导致二义性错误
★不要依赖标准类型的字长(标准未定义)
某些标准类型(例如int、wchar_t)的字长会随着具体的平台而改变。
★用枚举代替类的静态成员常量(不支持新标准)
某些老式的编译器不支持类的静态成员常量,可以用枚举来代替。
class CFoo
{
static const int MIN = 0; //不可移植
enum { MAX = 64 }; //可移植
};
今天说了这么一大堆,都比较琐碎,估计会有遗漏的。日后如果大伙儿发现有补充的,欢迎在本帖的评论中指教一二。由于篇幅有限,我把和异常相关的内容留到下一个话题。
http://program-think.blogspot.com/2009/01/cxx-cross-platform-develop-2-language.html
分享到:
相关推荐
C和C++是两种广泛用于跨平台开发的语言,因为它们具有高度的灵活性和广泛的可移植性。以下是对这两个主题的详细阐述: 一、跨平台软件开发 跨平台软件开发是指编写一次代码,然后能够在多种操作系统(如Windows、...
标题中的“纯标准c++实现的跨平台INI文件解析类”指的是使用纯C++语言编写的一个类库,它能够解析和操作INI配置文件,并且可以在多种操作系统上运行,体现出跨平台特性。INI文件是一种常见的轻量级配置文件格式,...
同时,为了确保代码的可移植性,开发者需要遵循标准C++,避免使用非标准的扩展和依赖特定平台的特性。 构建系统如CMake和Autotools可以帮助管理项目,它们可以生成适应不同编译器和平台的构建脚本,简化了跨平台...
1. 标准C++:不依赖于特定的操作平台,支持可移植性和跨平台开发。 2. UNIX下的C++编程(UC++):依赖于UNIX操作系统,重点是UNIX系统中的编程实践。 3. 核心C++(CoreC++):涵盖标准C++的核心内容,不依赖于操作...
然而,随着Symbian操作系统的逐渐淡出,现代开发者可能倾向于使用更现代的跨平台框架,如Qt,它允许在多种平台上使用ANSI C++,同时提供与Symbian兼容的API。 总之,了解ANSI C++和Symbian C++的差异对于S60平台的...
2. 跨平台开发原理:理解iOS和Android的系统架构和API调用机制,以及如何通过中间层抽象这些差异。 3. Lua与原生代码交互:如使用Lua C API或tolua++等工具进行绑定,实现Lua脚本调用C/C++函数。 4. 移动平台特性:...
QT5是Qt库的一个主要版本,它为软件开发者提供了一个跨平台的应用程序开发框架,支持Windows、Linux、macOS、Android以及iOS等多个操作系统。QT5不仅包含C++库,还支持QML(Qt Meta Language)进行UI设计,使得...
跨平台性对于开发者来说非常关键,因为它允许代码在不修改或少量修改的情况下在不同环境间移植,降低了开发和维护的成本。 C++是一种强类型、面向对象的编程语言,常用于系统软件、游戏引擎、桌面应用和服务器端...
5.5版本已对ANSI/ISO标准C++的兼容性达到92.73%,而最新的Borland C++ Builder X中的6.0版本则声称100%符合标准,这使得它成为一个理想的编译器选项,尤其对于关注代码一致性和可移植性的开发者。 2. Visual C++ ...
这对于提高代码的可移植性和降低维护成本具有显著优势。以下是对跨平台开发的一些关键知识点的详细阐述: 1. **C/C++混合编程**: 在C++中调用C函数是最常见的跨语言交互方式。为了实现这一点,C++代码需要包含C的...
12. **跨平台开发**:随着FireMonkey的引入,C++Builder和Delphi成为跨平台开发的有力工具,开发者可以用一套代码构建多平台应用。 13. **性能优化**:由于编译器的优化,C++Builder和Delphi生成的代码通常运行速度...
QT4编程是C++开发领域中的一个重要框架,尤其在创建用户界面(UI)和构建跨平台应用程序方面。本文将深入探讨QT4的核心概念、主要功能、编程原理以及如何利用源码进行跨平台开发。 首先,QT4是Qt库的一个版本,由...
C++因其高效性、可移植性和丰富的库支持,成为跨平台开发的理想选择。 在C++跨平台开发中,读者将学习到的关键知识点包括: 1. **C++基础**:首先,你需要熟悉C++的基础语法,包括类、对象、模板、异常处理、STL...
1. **跨平台软件开发** - 《跨平台软件开发 C & C++》.ceb:此书讲解了如何使用C++进行跨平台编程,涵盖了不同操作系统上的编译器差异、API调用以及移植性问题,帮助开发者创建能在多种操作系统上运行的代码。...
Boost库是C++社区的一个重要贡献,它提供了一系列高质量、经过充分测试的C++模板类库,旨在增强C++的标准库,提高开发效率和代码的可移植性。以下是对Boost库和《Boost开发指南》中的主要知识点的详细阐述。 1. **...
3. 程序可移植性强:C++编写的程序可以在不同平台之间进行移植,减少了跨平台开发的难度。 4. 程序设计自由度大:C++允许程序员以较高的自由度设计程序,但也因此对初学者来说有一定挑战,需要对语言规则有深入理解...
3. **兼容性好**:Boost库能够跨平台运行,无论是Windows、Linux还是Mac OS等操作系统,都能很好地支持。 4. **易于集成**:由于Boost库是纯C++实现的,因此非常容易集成到现有的项目中。 5. **社区活跃**:拥有庞大...
- **平台独立性**:Java的“一次编写,到处运行”原则使其具有高度的跨平台性,而C++的可移植性取决于编译器和操作系统。 - **性能**:C++通常被认为在执行效率上优于Java,特别是在需要低级别内存操作和算法优化...
### 软件工程与软件系统可移植性评估 #### 第1章 软件工程概述 ...这对于软件开发人员来说是非常宝贵的资源,可以帮助他们在开发过程中更好地考虑到软件的可移植性,从而提高软件产品的质量和市场竞争力。