8.3 程序组织
达到可移植性的方式,最重要的有两种,我们将把它们称为联合的方式和取交集的方式。
联合方式使用各个特殊途径的最佳特征,采用条件式的编译和安装,根据各个具体环境的特
殊情况分别进行处理。这样,结果代码是所有方案的一种联合,它可以利用各系统在能力方
面的优点。这种方式的缺点包括:安装过程的规模和复杂性,由代码中大量费解的编译条件
造成的复杂性等等。
只使用到处都可用的特征。我们建议采用取交集的方式,即:只使用那些在所有目标系统里
都存在的特性,绝不使用那些并不是到处都能用的特征。强求使用普遍可用特性也有危险性,
这可能限制了目标系统的范围,或者限制了程序的功能。此外,也可能在某些系统里导致性
能方面的损失。
为了比较这两种不同方式,我们来看一些使用联合方式的例子,以及采用交集方式对它
们重新进行整理的情况。正如你将要看到的,联合方式的代码从设计上看根本就是不可移植
的,虽然它们声称可移植性是自己的目标;而交集代码不仅是可移植的,通常也更加简单。
下面是个小例子,这里试图处理环境中因为某些原因而没有标准头文件 s t d l i b . h的情
况:
如果偶然用用的话,这种防御式测试还是可以接受的,但频繁地这样做就很不好了。这里也
提出了另一个问题:到底有多少 s t d l i b函数最后出现在这种形式的或者其他类似形式的条件
代码里。如果在程序里用到了 m a l l o c或者r e a l l o c,那么肯定也需要用其他的函数,例如
f r e e。如果unsigned int的大小与s i z e _ t(这是m a l l o c和r e a l l o c参数的正确类型 )不
一样,那么又会出什么问题?进一步说,我们怎么知道 S T D C _ H E A D E R S或_ L I B C确实已经定
156计计程序设计实践
下载
1