ANSI CISO CStandard C是指美國國家標準協會(ANSI)和國際標準化組織(ISO)對C語言發布的標準。歷史上,這個名字專門用於指代此標準的原始版本,也是支持最好的版本(稱為C89或C90)。使用C的軟件開發者被鼓勵遵循標準的要求,因為它鼓勵使用跨平台的代碼。

ANSI C和ISO C的歷史

C的第一個標準是由ANSI發布的。雖然這份文檔後來被國際標準化組織(ISO)採納並且ISO發布的修訂版亦被ANSI採納,但名稱ANSI C(而不是ISO C)仍被廣泛使用。[1]一些軟件開發者使用名稱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[2],這個版本有時候稱為C90。因此,C89C90通常指同一種語言。

C99

在2000年三月,ANSI採納了ISO/IEC 9899:1999標準。這個標準通常指C99。

C11

在2011年12月,ANSI採納了ISO/IEC 9899:2011標準。這個標準通常即C11。

C18

在2018年6月,ANSI採納了ISO/IEC 9899:2018標準,這個標準通常即C18(有時被稱為C17),它是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 *, const char *);
 #else
 extern int getopt();
 #endif

上面最好使用"#if __STDC__"而不是"#ifdef __STDC__",因為一些實現可能會把__STDC__設置為0來表示不遵循ANSI C。"__STDC__"能處理任何沒有被巨集替換或者值為0的標示符。因而即使巨集"__STDC__"沒有定義來表示不遵循ANSI C,"__STDC__"仍然能像顯示的那樣工作。

在上面的例子,一個原型中使用了ANSI實現兼容的函數聲明,而另一個使用了過時的非原形聲明。它們在C99和C90中依舊是ANSI兼容的,但並不被鼓勵使用。

支持ANSI C的編譯器

參考文獻

  1. ^ Brad Kelechava. The Origin of ANSI C and ISO C. 2017-09-14 [2018-08-14]. (原始內容存檔於2018-08-20). 
  2. ^ Standards - Using the GNU Compiler Collection (GCC). [2012-06-24]. (原始內容存檔於2012-06-17). 

外部連結