第六部分 开发跨平台和跨语言的应用
尽管对C++做了标准化,但是在用C++编写专业质量的程序时,
平台间的差异最终还是会反映出来,即使开发平台限于特定的,
编译器的一些小差异也会导致很严重的编程问题。
尽管C++是通用语言,但是可能并非完成特定任务的最佳选择。[
C++
与其他语言相结合]
一、跨平台开发
C++数组定义为保存在连续的内存块中,这个特定的实现细节就使得C++语言暴露了一个可能的问题:
并非所有系统都采用同样的方式来组织和管理内存。
1、体系结构问题
①、使用高级语言的好处就是编译器会负责将代码转换为处理器的
本地汇编码格式。
在编译一个C++程序时,源代码会转换为二进制指令由计算机执行,这种
二进制格式由平台定义,而不是
C++
语言定义。
跨编译
:解决二进制兼容性问题。
开源发布:让最终用户自己指定本地编译,并构建一个程序版本。
②、字和类型大小
字(word)是计算机体系结构的基本存储单元。一般来说,如果系统的字大小较大,就能处理更多的内存,并能更快地处理复杂的程序。
由于
指针是内存地址,因此
指针的大小自然就是字大小。
例:指针类型变量;32位Pentium体系结构中:4bytes。
64位Itanium体系结构中:8bytes。
注意:C++标准并没有预先确定大多数类型的大小。
③、字序
所有现代计算机都以二进制表示来存储数字,不过同一个数载两个平台上的表示可能并不一样。
只有当数据要
跨体系结构迁移时才会反映出字序问题。
PowerPC、Sparc处理器:Big-endian ordering(先放入内存的是数字中
较大的部分)
x86处理器:Little-endian ordering(先放入内存的是数字中
较小的部分)
2、实现问题
①、编译器疑难问题和扩展
编译器在最新增加的语言特性方面往往存在问题,因此口碑不佳。
②、库实现
编译器可能包括C++标准库的一个实现,其中包括标准模板库。不过,STL使用C++编写的,没有必要一定使用与编译器捆绑的STL库。
3、特定于平台的特性
专业的程序可能会要求一些
C++
并未提供的功能。
· 图形用户界面:用C++写一个图形应用,需要使用
特定于平台的库。
· 网络:C++没有为网络提供机制,但是存在许多的标准库。
· OS事件和应用交互:在纯C++代码中,很少与外部操作系统合其他应用交互,如果 没有平台扩展,能提供给标准C++程序的只有命令行参数而已。例如:粘贴复制之类的操作在C++中就没有直接提供支持,
需要平台提供的库。
· 低级文件
· 线程:在C++中并未直接对程序中并发线程的执行提供支持,其实现相当于依赖于操作系统的内部工作,所有C++语言没有包含线程,最常见的线程库称为:
pthreads。
二、跨语言开发
有时你想要的是一种混合语言,希望它混合了C++的
一般特性以及另一种语言的
特有特性。
1、混合C和C++
2、转换模式
要考虑在
过程性库之外编写一个面向对象包装器。
3、与C代码的链接
大多数的C代码都能顺利地用C++编译器编译,如果只有
编译后的
C
代码,可能是以库的形式提供给你,此时仍然能在C++程序中加以使用,不过为此需要多做几个步骤。
extern关键字及时告诉编译其某些函数是用C写的。
例:
extern “C” {
Void do_some_thing();
}
使用extern的一种更常见的模式是在
头文件级使用。
例:
extern “C” { #include “graphislib.h” }
※
指定整个头文件定义的函数都是用C编写的。
注意:尽管C++基本上是C的一个超集,但是不同的语言有不同的设计目标,可以调整C代码以便在C++中正常工作,尽管这种做法也是很常见的,但是
更好的做法是在过程性
C
代码外提供一个面向对象的
C++
包装器。
4、利用JNI混合Java和C++
Java
本地接口(
JNI
):Java语言的一部分,使用JNI,可以访问不是用Java语言编写的功能。如果Java程序开发的应用对性能要求很高,或者需要传统的代码,访问C++库就会很有用。
5、C++与Perl和Shell脚本的混合
6、C++与汇编代码的混合