[C陷阱和缺陷] 第7章 可移植性缺陷
阿新 • • 發佈:2018-12-08
C語言在許多不同的系統平臺上都有實現。的確,使用C語言編寫程式的一個首要原因就是,C程式能夠方便地在不同的程式設計環境中移植。
不同的系統有不同的需求,因此我們應該能夠預料到,機器不同則其上的C語言實現也由細微差別。今天,一個C程式設計師如果希望自己寫的程式在另一個程式設計環境也能夠工作,他就必須掌握許多這類細小的差別。本章要討論的是關於可移植性的幾個最常見的錯誤來源,重點放在語言的屬性上,而不是在函式庫的屬性上。
7.1 識別符號名稱的限制
某些C語言實現把一個識別符號中出現的所有字元都作為有效字元處理,而另一些C實現卻會自動地截斷一個長識別符號名稱的尾部。聯結器也會對它們能夠處理的名稱強加限制,例如外部名稱中只允許使用大寫字母。C實現者在面對這樣的限制時,一個合理的選擇就是強制所有的外部名稱必須是大寫。
因為這個原因,為了保證程式的可移植性,謹慎地選擇外部識別符號的名稱是重要的。比如說,兩個函式的名稱分別為 printf_fields 與 printf_float,這樣的命名方式就不恰當;同理,使用 State 與 STATE 這樣的命名方式也不明智。
下面這個例子多少有些讓人吃驚,考慮以下函式:
char *Malloc(unisgned n)
{
char *p, *malloc(unsigned);
p = malloc(n);
if (p == NULL)
{
printf("out of memory");
exit(-1);
}
return p;
}
上面的例子程式演示了一個確保檢測到記憶體耗盡的異常情況的簡單辦法:在程式中應該呼叫 malloc 函式分配記憶體的地方,改為呼叫 Malloc 函式。這樣,客戶程式就不必在每次呼叫 malloc 函式
在一個不區分外部名稱大小寫的C語言中呼叫函式 Malloc, 與 malloc 實際上是等同的,也就是說,庫函式 malloc 將被 Malloc 函式等效替換。