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_t
比 int
短;但你不能改用 int
,因為在某些機器上 dev_t
比 int
寬。在非標準定義中,沒有任何類型可以安全地在所有機器上使用。支援非標準 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