C語言標準 |
---|
K&R C • ANSI C • C99 • C11 • C18 • C2x |
C99(之前名稱為C9X)是ISO/IEC 9899:1999的非正式名稱,是C語言標準的一個版本[1]。C99延伸了C90的內容,加入了C語言及標準函式庫的新功能,讓一些語言的實現(例如IEEE 754-1985浮點數,以及編譯器技術)可以更妥善的利用電腦的硬體[2]。後來在2011年發行的C11取代了此版本的C語言標準。
歷史
在ANSI的標準確立後,C語言的規範在一段時間內沒有大的變動,然而C++在自己的標準化建立過程中繼續發展壯大。《標準修正案一》在1994年為C語言建立了一個新標準,但是只修正了一些C89標準中的細節和增加更多更廣的國際字符集支持。不過,這個標準引出了1999年ISO 9899:1999的發表。它通常被稱為C99。C99被ANSI於2000年3月採用。
設計
在C99中包括的特性有:
- 增加了對編譯器的限制,比如源始碼每行要求至少支持到 4095 字節,變量名函數名的要求支持到 63 字節(extern 要求支持到 31)。
- 增強了預處理功能。例如:
- 增加了新關鍵字 restrict, inline, _Complex, _Imaginary, _Bool
- 支持 long long, long double _Complex, float _Complex 等類型
- 支持不定長的數組,即數組長度可以在運行時決定,比如利用變量作為數組長度。聲明時使用 int a[var] 的形式。不過考慮到效率和實現,不定長數組不能用在全局,或 struct 與 union 。
- 變量聲明不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i<100;++i) 的形式,即i 只在 for 語句塊內部有效。
- 允許採用(type_name){xx,xx,xx} 類似於 C++ 的構造函數的形式構造匿名的結構體,即複合文字特性。
- 初始化結構體的時候允許對特定的元素賦值,形式為:
struct test{int a[3],b;} foo[] = { [0].a = {1}, [1].a = 2 };
struct test{int a, b, c, d;} foo = { .a = 1, .c = 3, 4, .b = 5 }; // 3,4 是对 .c,.d 赋值的
- 格式化字符串中,利用 \u 支持 unicode 的字符。
- 支持 16 進位的浮點數的描述。
- printf scanf 的格式化串增加了對 long long int 類型的支持。
- 浮點數的內部數據描述支持了新標準,可以使用 #pragma 編譯器指令指定。
- 除了已有的 __line__ __file__ 以外,增加了 __func__ 得到當前的函數名。
- 允許編譯器化簡非常數的表達式。
- 修改了 / % 處理負數時的定義,這樣可以給出明確的結果,例如在C89中-22 / 7 = -3, -22 % 7 = -1,也可以-22 / 7= -4, -22 % 7 = 6。 而C99中明確為 -22 / 7 = -3, -22 % 7 = -1,只有一種結果。
- 取消了函數返回類型默認為 int 的規定。
- 允許在 struct 的最後定義的數組不指定其長度,寫做 [](flexible array member)。
- const const int i 將被當作 const int i 處理。
- 增加和修改了一些標準頭文件,比如定義 bool 的 <stdbool.h> ,定義一些標準長度的 int 的 <inttypes.h> ,定義複數的 <complex.h> ,定義寬字符的 <wctype.h> ,類似於泛型的數學函數 <tgmath.h>, 浮點數相關的 <fenv.h>。 在<stdarg.h> 增加了 va_copy 用於複製 ... 的參數。<time.h> 里增加了 struct tmx ,對 struct tm 做了擴展。
- 輸入輸出對寬字符以及長整數等做了相應的支持。[3]
用於x86架構的GCC,Clang和其它一些商業編譯器(如IAR Systems,ICC)現支持C99的全部特性[4],而微軟和Borland支持C99的部分特性[5]。
參考資料
- ↑ ISO/IEC 9899:1999 - Programming languages - C. Iso.org. 2011-12-08 [2014-04-08].
- ↑ 存档副本 (PDF). [2020-07-03].
- ↑ ISO/IEC 9899:1999 (PDF). [2020-06-10].
- ↑ GCC從3.0版本開始正式支持C99(-std=c99),詳情見
- ↑ Peter Bright. C99 acknowledged at last as Microsoft lays out its path to C++14. Ars Technica. 2013-06-29 [2015-01-09].
延伸閱讀
- Cheng, Harry. C99 & Numeric computing. Dr. Dobb's Journal. 2002-03-01.
- Seebach, Peter. Open source development using C99. developerWorks. IBM. 2004-03-24 [2020-07-03].
- Final version of the C99 standard with corrigenda TC1, TC2, and TC3 included, formatted as a draft (PDF). [2020-07-03]. (3.61 MB)
- Rationale for International Standard—Programming Languages—C Revision 5.10, April-2003, Rationale for C99
外部連結
前任者: C89 / C90 / "ANSI C" |
C語言標準 | 繼任者: C11 |