標準簡介
C99是在C89/90的基礎上發展起來的,增加了基本數據類型、關鍵字和一些
系統函式等。
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標準中會出錯的)
可變參數宏的示例代碼:
#include <stdio.h>#define MY_DEBUG_LOG(...) (printf(__VA_ARGS__))#define MY_DEBUG_TRACE(format,...) (printf(format,##__VA_ARGS__))int main(void){ MY_DEBUG_LOG("Hello, world! The value is:%d\n", 100); MY_DEBUG_TRACE("Hello, world! The value is:%d\n", -100); MY_DEBUG_LOG("Hello,world!"); MY_DEBUG_TRACE("Hi,there!"); //MY_DEBUG_TRACE("424632975"); //MY_DEBUG_TRACE("Q qun +上面");}
支持 // 行
注釋(這個特性實際上在C89的很多
編譯器上已經被支持了)
支持 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 };
支持 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所支持的
複數語法特性的使用示例代碼:
#include <math.h>#include <stdio.h>#include <complex.h>int main(void){ float_Complex f = -1.0f; f = csqrtf( f ) + 1.0iF; printf( "Thecomplexnumberis:%g+i %g\n", crealf(f), cimagf(f) ); double_Complexd=cexp(2.0i * M_PI); printf( "e^(i2PI) = %f+i%f\n", creal(d), cimag(d) );}
long long int
C99標準中引進了long long int(-263至263 - 1)和unsigned long long int(0到264 - 1)。long long int能夠支持的整數長度為64位。
後續標準
C99標準之後,新的C語言標準是
國際標準化組織(ISO)和
國際電工委員會(IEC)在2011年12月8日正式發布的
C11標準,官方正式名為ISO/IEC 9899:2011。