设为首页 加入收藏

TOP

9.8 运行期程序库
2013-10-07 15:04:40 来源: 作者: 【 】 浏览:62
Tags:9.8 运行 程序

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:


  1. 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函数包含了一个类型漏洞:
  1. /*C代码*/  
  2.      void modify_string(const char*p){   
  3.          char* q = strchr(p, p[0]);  
  4.          q[0] = 'x';  
  5.      }  

在这里,我们可以使用strchr的返回值来改变p指向的字符串(strchr函数中p的类型是const char*的)。为了解决这个问题,在ANSI/ISO C++(www.cppentry.com)中,我们将如下重载和声明strchr函数:
  1. //C++(www.cppentry.com)代码  
  2.      char* strchr(char* p, char c);      
  3.      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)标准程序库得到官方定义之后,也并不是所有的平台都会提供整个程序库。考虑一个用于在汽车发动机中执行的程序,当需要执行下面语句时,这个程序应该怎么做呢?

  1. 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)程序员如果希望把代码移植到新的平台,就应该充分了解这个平台所提供的程序库。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.4.2 未经指定的行为 下一篇9.5 实现依赖性

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: