c99

c99

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

基本介紹

  • 中文名:C99
  • 外文名:C99
  • 類型:C語言官方標準第二版
  • 標準編號:ISO/IEC 9899:1999
標準簡介,新特性,後續標準,

標準簡介

C99是在C89/90的基礎上發展起來的,增加了基本數據類型、關鍵字和一些系統函式等。
C99有一部分是對於增加了寬字元集,還加入了一些庫函式,是繼C89標準之後的第二個C語言官方標準。第一個C++語言官方標準C++98標準,就是基於C89編寫的,因此C99標準新增的語法特性在C++的編譯器中就或多或少地支持了,而完全或幾乎完全支持C99標準的主流編譯器有:GCCClangIntel 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標準中會出錯的)
可變參數宏的示例代碼:
#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的很多編譯器上已經被支持了)
增加了新關鍵字 restrictinline,_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 進制的浮點數的描述
所以 printfscanf 的格式化串增加了支持 "%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。

相關詞條

熱門詞條

聯絡我們