下一主题:,上一主题:,上一级:编写 C 代码   [目录][索引]


5.6 CPU 之间的可移植性

即使是 GNU 系统也会因 CPU 类型的差异而有所不同——例如,字节顺序和对齐要求的差异。处理这些差异绝对是必要的。但是,不要试图去适应 int 小于 32 位的情况。我们不支持 GNU 中的 16 位机器。

您无需考虑 long 会小于指针和 size_t 的可能性。我们知道存在一个这样的平台:Microsoft Windows 上的 64 位程序。如果您关心在 Windows 上使用 Mingw64 运行您的软件包,您将需要处理 8 字节的指针和 4 字节的 long,这将破坏此代码

printf ("size = %lu\n", (unsigned long) sizeof array);
printf ("diff = %ld\n", (long) (pointer2 - pointer1));

是否在您的软件包中支持 Mingw64 以及一般的 Windows,这取决于您的选择。GNU 项目并没有说您有任何责任这样做。我们的目标是取代包括 Windows 在内的专有系统,而不是增强它们。如果有人迫使您在 Windows 上运行您的程序,而您对此不感兴趣,您可以回答说:“切换到 GNU/Linux — 您的自由取决于它。”

off_t 这样的预定义文件大小类型是一个例外:它们在许多平台上都比 long 长,因此上面的代码将无法与它们一起使用。可移植地打印 off_t 值的一种方法是自己逐个打印它的数字。

不要假设 int 对象的地址也是其最低有效字节的地址。这在 Big-Endian 机器上是错误的。因此,不要犯以下错误

int c;
…
while ((c = getchar ()) != EOF)
  write (file_descriptor, &c, 1);

而是按如下方式使用 unsigned char。(unsigned 是为了移植到不常见的系统中,在这些系统中,char 是有符号的,并且存在整数溢出检查。)

int c;
while ((c = getchar ()) != EOF)
  {
    unsigned char u = c;
    write (file_descriptor, &u, 1);
  }

如果可以,请避免将指针强制转换为整数。这种强制转换会大大降低可移植性,并且在大多数程序中都容易避免。在必须将指针强制转换为整数的情况下——例如,一个 Lisp 解释器将类型信息和地址存储在一个字中——您将不得不明确规定处理不同的字大小。您还需要为 malloc 获取的正常地址范围远离零的系统做出规定。


下一主题:,上一主题:,上一级:编写 C 代码   [目录][索引]