下一主題:,上一主題:,上一層:C 語言編寫   [目錄][索引]


5.6 CPU 之間的移植性

即使是 GNU 系統也會因為 CPU 類型的差異而有所不同——例如,位元組順序和對齊要求的差異。處理這些差異絕對是必要的。然而,不要為了 int 可能小於 32 位元的情況而費心。GNU 不支援 16 位元機器。

您無需為了 long 可能小於指標和 size_t 的情況而費心。我們知道有這樣一個平台:Microsoft Windows 上的 64 位元程式。如果您關心讓您的套件在使用 Mingw64 的 Windows 上運行,您將需要處理 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 語言編寫   [目錄][索引]