軟體介紹
1983 年, 美國國家標準協會(ANSI)委任一個委員會 X3J11 對 C 語言 進行標準化。 經過長期艱苦的過程, 該委員會的工作於 1989 年 12 月 14 日正式被批准為ANSI X3.159-1989 並於 1990 年春天頒布。
一年左右以後, 該標準被接受為國際標準, ISO/IEC 9899:1990, 這個標準甚至在美國國內(在這裡它被稱作 ANSI/ISO 9899-1990 [1992])代替了早先的 X3.159。作為一個 ISO 標準, 它會以發行技術刊物和標準附錄的形式不斷更新。
1994年, 技術刊物 1 (TC1) 修正標準中 40 處地方, 多數都是小的修改或明確, 而標準附錄 1 (NA1) 增加了大約 50 頁的新材料, 多數是規定國際化支持的新庫函式。1995 年, TC2 增加了一些更多的小修改。
該標準的一個重大修訂,“C99”, 已經完成並於2000年的時候被接受。
該標準的數個版本,包括 C99 和原始的 ANSI 標準, 都包括了一個 ``基本原理" (Rational), 解釋它的許多決定並討論了很多細節問題,包括本文中提及的某些內容。
American National Standards Institute(ANSI——美國國家標準學會) 由公司、政府和其他成員組成的自願組織。它們協商與標準有關的活動,審議美國國家標準,並努力提高美國在國際標準化組織中的地位。此外,ANSI使有關通信和網路方面的國際標準和美國標準得到發展。ANSI是IEC和ISO的成員之一。
ANSI的地位:ANSI是一個準國家式的標準機構,它為那些在特定領域建立標準的組織提供區域許可,如電氣電子工程師協會(IEEE)。ANSI是國際標準化委員會(ISO)和國際電工委員會(IEC)5個常任理事成員之一,4個理事局成員之一,參加79%的ISO/TC的活動,參加89%的IEC/TC活動。ANSI 是泛美技術標準委員會(COPANT)和太平洋地區標準會議(PASC)的成員。
歷史
C 的第一個標準是由ANSI發布的。雖然這份文檔後來被國際標準化組織(ISO)採納並且ISO發布的修訂版也被ANSI採納了,但名稱ANSI C(而不是 ISO C)仍被廣泛使用。一些軟體開發者使用 ISO C,還有一些使用 Standard C。
C89
1983年,美國國家標準協會(ANSI)組成了一個委員會,X3J11,為了創立 C 語言的標準。經過漫長而艱苦的過程,該標準於1989年完成,並在作為ANSI X3.159-1989 "Programming Language C"正式生效。因為這個標準是1989年發布的,所以一般簡稱C89標準。有些人也把C89標準叫做ANSI C,因為這個標準是美國國家標準協會(ANSI)發布的。
C90
在1990年,ANSI C89標準被國際標準化組織(ISO)和國際電工委員會(IEC)採納為國際標準,名叫ISO/IEC 9899:1990 - Programming languages -- C ,有些人簡稱C90標準。因此, C89和 C90通常指同一個標準,一般更常用C89這種說法。
C99
在2000年3月,國際標準化組織(ISO)和國際電工委員會(IEC)採納了第二個C語言標準,名叫ISO/IEC 9899:1999 - Programming languages -- C,簡稱C99標準。
C11
在2011年12月,國際標準化組織(ISO)和國際電工委員會(IEC)採納了第三個C語言標準,名叫ISO/IEC 9899:2011 - Information technology -- Programming languages -- C,簡稱C11標準。它是C程式語言的最新標準。
編譯器的支持
ANSI C被幾乎所有廣泛使用的編譯器支持。而且多數C代碼是在ANSI C基礎上寫的。任何僅僅使用標準C並且沒有任何硬體依賴假設的代碼實際上能保證在任何平台上用遵循C標準的編譯器編譯成功。如果沒有這種預防措施,多數程式只能在一種特定的平台或特定的編譯器上編譯,例如,使用非標準庫,例如圖形用戶界面庫,或者有關編譯器或平台特定的特性例如數據類型的確切大小和位元組序。
選擇編譯
為了減輕K&R C和ANSI C標準,__STDC__("standard c")巨集可以被用來將代碼分割為ANSI和K&R部分。
#if __STDC__
extern int getopt(int,char*const*,constchar*);
#else
extern int getopt();
#endif
上面最好使用"#if __STDC__"而不是"#ifdef __STDC__",因為一些實現可能會把 __STDC__設定為0來表示不遵循ANSI C。"__STDC__"能處理任何沒有被巨集替換或者值為0的標示符。因而即使巨集"__STDC__"沒有定義來表示不遵循ANSI C,"__STDC__"仍然能像顯示的那樣工作。
在上面的例子,一個原型中使用了ANSI實現兼容的函式聲明,而另一個使用了過時的非原形聲明。它們在C99和C90中依舊是ANSI兼容的,但並不被鼓勵使用。
支持編譯器
GCC
Microsoft Visual C++ (C90. A few features of C99) (msvc doesn't support C99 at all. for example )
ARM RealView