9.8 运行期程序库
多数平台都提供了C++(www.cppentry.com)程序员可以使用的程序库集合。例如,具有文件系统的平台就会提供用于创建文件和修改文件的函数;而不含文件系统的平台-例如,一个用于在汽车发动机内部执行嵌入式程序的平台-将不提供这些函数。因为不同平台提供的程序库差异往往非常大,所以C++(www.cppentry.com)代码应该只使用那些所有平台共有的功能,才能使这部分代码是可移植的。
虽然ARM中并没有提到,一个标准的程序库应该是根据ANSI/ISO C++(www.cppentry.com)标准定义的;但当这本书编写的时候,ANSI/ISO标准草案中声明一个标准的C++(www.cppentry.com)程序库应该具有下面领域的功能:
语言支持;
诊断;
一般实用程序;
局部化;
容器;
迭代器;
算法;
数值类型;
输入和输出(即iostream程序库)。
直到今天,大多数C++(www.cppentry.com)实现仍然没有提供整个草案程序库,而只是提供下面的功能 :
iostream程序库的某些变型。这些实现与草案标准中的iostream实现是不同的;
大多数ANSI/ISO C(不是C++(www.cppentry.com))程序库,经过了某些修改。
实际标准的iostream库是贝尔实验室在1988年创建的。这个程序库有几点优于以前的stream程序库。首先,早期的stream库和后来的iostream库,都由实际标准编译器cfront所支持;于是ANSI/ISO C++(www.cppentry.com)委员会就抓住这个机会来改善iostream库的设计;当编写这本书时,iostream库的接口不断地发生改变,甚至几乎没有C++(www.cppentry.com)实现可以完全支持草案标准的iostream库。在大多数C++(www.cppentry.com)实现都提供ANSI/ISO的标准iostream库之前,那些旨在编写可移植代码的程序员,在编写含有输入操作和输出操作的代码时候,都必须以非常小心谨慎的态度来编写对所有的iostream程序库都适用的代码。
ANSI/ISO C程序库,经过某些修改,会演化成ANSI/ISO C++(www.cppentry.com)程序库的一个子集。之所以需要经过某些修改,是因为C和C++(www.cppentry.com)的类型系统有某些小的差异。例如,考虑在C程序库声明的函数strchr:
- char*strchr(const char* p, int c); /*ANSI/ISO C */
这个函数返回一个指针,指向非null结尾的字符串p中第一次出现字符c的位置;如果c不在字符串中,那么将返回0。第2个参数的类型为int,这是因为在C中,文字字符(如x)的类型都是int,而不是char;文字字符在C++(www.cppentry.com)中才使用字符类型char。只要仔细观察,不难发现C的strchr函数包含了一个类型漏洞:- /*C代码*/
- void modify_string(const char*p){
- char* q = strchr(p, p[0]);
- q[0] = 'x';
- }
在这里,我们可以使用strchr的返回值来改变p指向的字符串(strchr函数中p的类型是const char*的)。为了解决这个问题,在ANSI/ISO C++(www.cppentry.com)中,我们将如下重载和声明strchr函数: - //C++(www.cppentry.com)代码
- char* strchr(char* p, char c);
- const char* strchr(const char* p, char c);
当编写这本书时,ANSI/ISO C++(www.cppentry.com)委员会正在讨论应该如何把这个更改应用到用于C++(www.cppentry.com)的C程序库中。
即使在ANSI/ISO C++(www.cppentry.com)标准程序库得到官方定义之后,也并不是所有的平台都会提供整个程序库。考虑一个用于在汽车发动机中执行的程序,当需要执行下面语句时,这个程序应该怎么做呢?
- cout<< "Hello, Officer!\n"
嵌入式程序通常都没有用于打印消息的相应输出设备;因此,一个用于给程序编写嵌入式代码的平台,可能不会提供整个 iostream 程序库,或许只在测试模式提供iostream程序库(见5.3.1节)。
大多数平台还提供了标准C++(www.cppentry.com)程序库以外的程序库。例如,许多平台提供了定义在SystemV Interface Defination (SVID)[AT&89]的程序库。SVID定义了一个用于访问很多功能的C接口,C++(www.cppentry.com)程序员也可以访问这个接口。另外,Portable Operationg System Environment for Computer Enviroments Standard (POSIX)[IEE90]也定义了一个函数库,主要用于和底层操作系统进行交互。某些平台还提供了标准文档没有描述、但却是实际标准的程序库。我们将不在这里讨论这些程序库。C++(www.cppentry.com)程序员如果希望把代码移植到新的平台,就应该充分了解这个平台所提供的程序库。