介紹
ANSI C是美國國家標準協會(ANSI)對C語言發布的標準。使用C的軟體開發者被鼓勵遵循ANSI C文檔的要求,因為它鼓勵使用跨平台的代碼。
歷史
C 的第一個標準是由ANSI發布的。雖然這份文檔後來被國際標準化組織(ISO)採納並且ISO發布的修訂版也被ANSI採納了,但名稱ANSI C(而不是 ISO C)仍被廣泛使用。一些軟體開發者使用 ISO C,還有一些使用 Standard C。
C89
1983年,美國國家標準協會組成了一個委員會,X3J11,為了創立 C 的一套標準。經過漫長而艱苦的過程,該標準於1989年完成,並在作為ANSI X3.159-1989 "Programming Language C"正式生效。這個版本的語言經常被稱作"ANSI C",或有時稱為"C89"(為了區別C99)。
C90
在1990年,ANSI C標準(帶有一些小改動)被美國國家標準協會採納為ISO/IEC 9899:1990。這個版本有時候稱為C90。因此, C89和 C90通常指同一種語言。
C99
主條目:C99
在2000年三月,ANSI 採納了 ISO/IEC 9899:1999 標準。這個標準通常指C99。
C11
主條目:C11
在2011年12月,ANSI採納了ISO/IEC 9899:2011標準。這個標準通常即C11,它是C程式語言的現行標準。
編譯器的支持
ANSI C現在被幾乎所有廣泛使用的編譯器支持。現在多數C代碼是在ANSI C基礎上寫的。任何僅僅使用標準C並且沒有任何硬體依賴假設的代碼實際上能保證在任何平台上用遵循C標準的編譯器編譯成功。如果沒有這種預防措施,多數程式只能在一種特定的平台或特定的編譯器上編譯,例如,使用非標準庫,例如圖形用戶界面庫,或者有關編譯器或平台特定的特性例如數據類型的確切大小和位元組序.
[編輯]選擇編譯 為了減輕K&R C和ANSI C標準,__STDC__("standard c")宏可以被用來將代碼分割為ANSI和K&R部分。
#if __STDC__
externint getopt(int,char*const*,constchar*);
#else
externint getopt();
#endif
上面最好使用"#if __STDC__"而不是"#ifdef __STDC__",因為一些實現可能會把 __STDC__設定為0來表示不遵循ANSI C。"__STDC__"能處理任何沒有被宏替換或者值為0的標示符。因而即使宏"__STDC__"沒有定義來表示不遵循ANSI C,"__STDC__"仍然能像顯示的那樣工作。
在上面的例子,一個原型中使用了ANSI實現兼容的函式聲明,而另一個使用了過時的非原形聲明。它們在C99和C90中依舊是ANSI兼容的,但並不被鼓勵使用。