c99的新功能

2021-09-28 12:14:12 字數 1440 閱讀 7884

參考 

在ansi的標準確立後,c語言的規範在一段時間內沒有大的變動,然而c++在自己的標準化建立過程中繼續發展壯大。《標準修正案一》在2023年為c語言建立了乙個新標準,但是只修正了一些c89標準中的細節和增加更多更廣的國際字符集支援。不過,這個標準引出了2023年iso 9899:1999的發表。它通常被稱為c99。c99被ansi於2023年3月採用。

在c99中包括的特性有:

增加了新關鍵字 restrict, inline, _complex, _imaginary, _bool

支援不定長的陣列,即陣列長度可以在執行時決定,比如利用變數作為陣列長度。宣告時使用int a[var] 的形式。不過考慮到效率和實現,不定長陣列不能用在全域性,或 struct 與 union。

變數宣告不必放在語句塊的開頭,for 語句提倡寫成 for(int i=0;i<100;++i) 的形式,即i只在 for 語句塊內部有效。

允許採用(type_name) 類似於 c++ 的建構函式的形式構造匿名的結構體。

初始化結構的時候允許對特定的元素賦值,形式為:

struct test foo =  , [1].a = 2 };
struct test foo =  ;  // 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 的 ,定義一些標準長度的 int 的 ,定義複數的 ,定義寬字元的 ,類似於泛型的數學函式 , 浮點數相關的 。 在增加了 va_copy 用於複製 ... 的引數。裡增加了 struct tmx ,對 struct tm 做了擴充套件。

輸入輸出對寬字元以及長整數等做了相應的支援。

但是各個公司對c99的支援所表現出來的興趣不同。當gcc和其它一些商業編譯器支援c99的大部分特性的時候[4],微軟和borland卻似乎對此不感興趣。

C99標準之前沒有bool型別(C99提供)

我們知道在c 裡有專門的bool型別,用來表示真或假。但是在c語言裡沒有這樣的型別。表示式的值0為假,非0為真。所以條件判斷語句 if while 非常靈活,甚至乙個指標型別都可以是條件表示式。為了使程式更清晰,我們常常會給出如下的巨集定義 typedef int bool define true ...

復合文字(C99)

1.假如需要向帶有乙個int參量的函式傳遞乙個值,您可以傳遞乙個int變數,也可以傳遞乙個int常量,比如5。在c99標準之前,陣列引數的情況是不相同的 可以傳遞陣列,但沒有所謂的陣列常量可供傳遞。c99新增了復合文字 compound literal 文字是非符號常量,例如5是int型別的文字,8...

keil arm 中配置c99方法 及 C99特性

配置方法 option c c misc controls c99 附c99特性 在ansi的標準確立後,c語言的規範在一段時間內沒有大的變動,然而c 在自己的標準化建立過程中繼續發展壯大。標準修正案一 在1994年為c語言建立了乙個新標準,但是只修正了一些c89標準中的細節和增加更多更廣的國際字符...