下一篇: ,上一篇: ,上一層: 設計建議   [目錄][索引]


3.4 標準 C 與前標準 C

1989 年標準 C 現在已廣泛普及,在程式中使用其特性是沒問題的。但有一個例外:永遠不要使用標準 C 的「三字符序列」特性。

1999 年和 2011 年版本的標準 C 並非在所有平台上都獲得完整支援。如果你的目標是支援 GCC 以外的編譯器進行編譯,則不應在程式中要求使用這些 C 特性。當編譯器支援這些特性時,有條件地使用它們是可以的。

如果你的程式僅旨在用 GCC 編譯,那麼當這些特性帶來實質效益且 GCC 支援它們時,你就可以使用它們。

然而,在大多數程式中支援前標準編譯器是很容易的,所以如果你知道如何做到這一點,請隨意使用。

為了支援前標準 C,不要以標準原型形式編寫函式定義,

int
foo (int x, int y)
…

而是像這樣以預標準風格編寫定義,

int
foo (x, y)
     int x, y;
…

並使用單獨的宣告來指定參數原型

int foo (int, int);

無論如何,你都需要在標頭檔中進行這樣的宣告,以便在所有呼叫該函式的文件中獲得原型的益處。而且一旦你有了宣告,通常以預標準風格編寫函式定義並不會有任何損失。

這種技術不適用於窄於 int 的整數類型。如果你認為參數的類型窄於 int,請改為將其宣告為 int

在少數特殊情況下,這種技術很難使用。例如,如果函式參數需要容納系統類型 dev_t,你就會遇到麻煩,因為在某些機器上 dev_tint 短;但你不能改用 int,因為在某些機器上 dev_tint 寬。在非標準定義中,沒有任何類型可以安全地在所有機器上使用。支援非標準 C 並傳遞此類參數的唯一方法是使用 Autoconf 檢查 dev_t 的寬度,並相應地選擇參數類型。這可能不值得這麼麻煩。

為了支援不識別原型的前標準編譯器,你可能需要使用像這樣的預處理器巨集

/* Declare the prototype for a general external function.  */
#if defined (__STDC__) || defined (WINDOWSNT)
#define P_(proto) proto
#else
#define P_(proto) ()
#endif

下一篇: ,上一篇: ,上一層: 設計建議   [目錄][索引]