即使是 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
获取的正常地址范围远离零的系统做出规定。