c99

c99

C99標準是 ISO/IEC 9899:1999 - Programming languages -- C 的簡稱 ,是C語言的官方標準第二版。1999年12月1日,國際標準化組織(ISO)和國際電工委員會(IEC)旗下的C語言標準委員會(ISO/IEC JTC1/SC22/WG14)正式發布了這個標準檔案 。

標準簡介

C99是在C89/90的基礎上發展起來的,增加了基本數據類型、關鍵字和一些系統函式等。

C99有一部分是對於增加了寬字元集,還加入了一些庫函式,是繼C89標準之後的第二個C語言官方標準。第一個C++語言官方標準C++98標準,就是基於C89編寫的,因此C99標準新增的語法特性在C++的編譯器中就或多或少地支持了,而完全或幾乎完全支持C99標準的主流編譯器有:GCC 、Clang 、Intel C++ Compiler 等。另外,Visual Studio2013也部分支持了C99語法特徵 。

C99標準的 草案是免費的 。

新特性

在ANSI標準化發布了C89標準以後,C語言的標準在一段相當的時間內都保持不變,儘管C++繼續在改進。(實際上,Normative Amendment1在1995年已經開發了一個新的C語言版本(即C95)。但是這個版本很少為人所知。)標準在90年代才經歷了改進,這就是ISO/IEC 9899:1999(1999年出版)。這個版本就是通常提及的C99。

在C99中包括的特性有:

對編譯器限制增加了,比如源程式每行要求至少支持到 4095 位元組,變數名與函式名的要求支持到 63 位元組 (extern 要求支持到 31)。

預編譯處理增強了。例如:

支持了可變參數的宏(Variadic Macro): #define Macro(...) __VA_ARGS__

使用宏的時候,參數如果不寫,宏里用 #,## 這樣的東西會擴展成空串。(C89標準中會出錯的)

可變參數宏的示例代碼:

支持 // 行注釋(這個特性實際上在C89的很多編譯器上已經被支持了)

增加了新關鍵字 restrict,inline,_Complex,_Imaginary,_Bool

支持 long long,long double _Complex,float _Complex 這樣的類型

支持 <: :> <% %> %: %:%: ,等等奇怪的符號替代,D&E 里提過這個

支持了不定長的數組。數組的長度就可以用變數了。聲明類型的時候呢,就用 int a[*] 這樣的寫法。不過考慮到效率和實現,這玩意並不是一個新類型。所以就不能用在全局裡,或者 struct union 裡面,如果你用了這樣的東西,goto 語句就受限制了。

變數聲明不必放在語句塊的開頭,for 語句提倡這么寫 for(int i=0;i<100;++i) 就是說,int i 的聲明放在裡面,i 只在 for 裡面有效。(VC6.0沒有遵守這條標準,i 在 for 外也有效;但vc2005里已經默認是i在外面不可見了,但有編譯選項可以設定。)

複合字面量:當一個類似結構的東西需要臨時構造的時候,可以用 (type_name){xx,xx,xx} 這有點像 C++ 的構造函式

相較於C89標準,C99標準新增了一種結構體/數組的初始化方式,名叫designated initializers ,即:

struct { int a[3], b; } w[] ={ [0].a = {1}, [1].a[0] = 2 };

字元串裡面,\u 支持 unicode 的字元

支持 16 進制的浮點數的描述

所以 printf和scanf 的格式化串增加了支持 "%lld"和"%llu",對應long long int類型和unsigned long long int類型(可以分別簡寫為long long和unsigned long long)。

浮點數的內部數據描述支持了新標準,這個可以用 #pragma 編譯器指定

增加了一個內置的局部靜態字元數組變數 __func__ ,可以用於得到當前函式的函式名 。

對於非常量的表達式,也允許編譯器做化簡

修改了 /% 處理負數時的定義,這樣可以給出明確的結果,例如在C89中-22 / 7 = -3, -22% 7 = -1,也可 以-22 / 7= -4, -22% 7 = 6。 而C99中明確為 -22 / 7 = -3, -22% 7 = -1,只有一種結果。

取消了不寫函式返回類型默認就是 int 的規定

允許 struct 定義的最後一個數組寫做 [] 不指定其長度描述

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 做了擴展

輸入輸出對寬字元還有長整數等做了相應的支持

long double_Complex;long double_Imaginary。

<complex.h>頭檔案中定義了complex和imaginary宏,並將它們擴展為_Complex和_Imaginary,因此在編寫新的應用程式時,應該使用<stdbool.h>頭檔案中的complex和imaginary宏。下面是關於C99所支持的複數語法特性的使用示例代碼:

long long int

C99標準中引進了long long int(-2 至2 - 1)和unsigned long long int(0到2 - 1)。long long int能夠支持的整數長度為64位。

後續標準

C99標準之後,新的C語言標準是國際標準化組織(ISO)和國際電工委員會(IEC)在2011年12月8日正式發布的C11標準,官方正式名為ISO/IEC 9899:2011 。

相關詞條

熱門詞條

聯絡我們