注: GCC支持C99, 通過(guò) --std=c99 命令行參數(shù)開(kāi)啟,如: 代碼: gcc --std=c99 test.c -------------------------------------------------------------------------------------------------- 1、增加restrict指針 C99中增加了公適用于指針的restrict類(lèi)型修飾符,它是初始訪問(wèn)指針?biāo)笇?duì)象的惟一途徑,因此只 有借助restrict指針表達(dá)式才能訪問(wèn)對(duì)象。restrict指針指針主要用做函數(shù)變?cè)?,或者指向由malloc()函 數(shù)所分配的內(nèi)存變量。restrict數(shù)據(jù)類(lèi)型不改變程序的語(yǔ)義。 如果某個(gè)函數(shù)定義了兩個(gè)restrict指針變?cè)?,編譯程序就假定它們指向兩個(gè)不同的對(duì)象,memcpy() 函數(shù)就是restrict指針的一個(gè)典型應(yīng)用示例。C89中memcpy()函數(shù)原型如下: 代碼: void *memcpy (void *s1, const void *s2, size_t size); 如果s1和s2所指向的對(duì)象重疊, 其操作就是未定義的。memcpy()函數(shù)只能用于不重疊的對(duì)象。C99中memcpy()函數(shù)原型如下: 代碼: void *memcpy(void *restrict s1, const void *restrict s2,size_t size); 通過(guò)使用restrict 修飾s1和s2 變?cè)?,可確保它們?cè)谠撛椭兄赶虿煌膶?duì)象。 2、inline(內(nèi)聯(lián))關(guān)鍵字 內(nèi)聯(lián)函數(shù)除了保持結(jié)構(gòu)化和函數(shù)式的定義方式外,還能使程序員寫(xiě)出高效率的代碼.函數(shù)的每次調(diào)用與 返回都會(huì)消耗相當(dāng)大的系統(tǒng)資源,尤其是當(dāng)函數(shù)調(diào)用發(fā)生在重復(fù)次數(shù)很多的循環(huán)語(yǔ)句中時(shí).一般情況下,當(dāng)發(fā) 生一次函數(shù)調(diào)用時(shí),變?cè)枰M(jìn)棧,各種寄存器內(nèi)存需要保存.當(dāng)函數(shù)返回時(shí),寄存器的內(nèi)容需要恢復(fù)。如果該 函數(shù)在代碼內(nèi)進(jìn)行聯(lián)機(jī)擴(kuò)展,當(dāng)代碼執(zhí)行時(shí),這些保存和恢復(fù)操作旅游活動(dòng)會(huì)再發(fā)生,而且函數(shù)調(diào)用的執(zhí) 行速度也會(huì)大大加快。函數(shù)的聯(lián)機(jī)擴(kuò)展會(huì)產(chǎn)生較長(zhǎng)的代碼,所以只應(yīng)該內(nèi)聯(lián)對(duì)應(yīng)用程序性能有顯著影響的 函數(shù)以及長(zhǎng)度較短的函數(shù)。 3、新增數(shù)據(jù)類(lèi)型 _Bool 值是0或1。C99中增加了用來(lái)定義bool、true以及false宏的頭文件夾<stdbool.h>,以便程序 員能夠編寫(xiě)同時(shí)兼容于C與C++的應(yīng)用程序。在編寫(xiě)新的應(yīng)用程序時(shí),應(yīng)該使用 <stdbool.h>頭文件中的bool宏。 _Complex and _Imaginary C99標(biāo)準(zhǔn)中定義的復(fù)數(shù)類(lèi)型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary. <complex.h>頭文件中定義了complex和imaginary宏,并將它們擴(kuò)展為_(kāi)Complex和_Imaginary, 因此在編寫(xiě)新的應(yīng)用程序時(shí),應(yīng)該使用<stdbool.h>頭文件中的complex和imaginary宏。 long long int C99標(biāo)準(zhǔn)中引進(jìn)了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能夠支持的整數(shù)長(zhǎng)度為64位。 4、對(duì)數(shù)組的增強(qiáng) 可變長(zhǎng)數(shù)組 C99中,程序員聲明數(shù)組時(shí),數(shù)組的維數(shù)可以由任一有效的整型表達(dá)式確定,包括只在運(yùn)行時(shí)才能確定 其值的表達(dá)式,這類(lèi)數(shù)組就叫做可變長(zhǎng)數(shù)組,但是只有局部數(shù)組才可以是變長(zhǎng)的. 可變長(zhǎng)數(shù)組的維數(shù)在數(shù)組生存期內(nèi)是不變的,也就是說(shuō),可變長(zhǎng)數(shù)組不是動(dòng)態(tài)的.可以變化的只是數(shù)組的大小. 可以使用*來(lái)定義不確定長(zhǎng)的可變長(zhǎng)數(shù)組。 數(shù)組聲明中的類(lèi)型修飾符 在C99中,如果需要使用數(shù)組作為函數(shù)變?cè)?,可以在?shù)組聲明的方括號(hào)內(nèi)使用static關(guān)鍵字,這相 當(dāng)于告訴編譯程序,變?cè)赶虻臄?shù)組將至少包含指定的元素個(gè)數(shù)。也可以在數(shù)組聲明的方括號(hào)內(nèi)使用 restrict,volatile,const關(guān)鍵字,但只用于函數(shù)變?cè)?。如果使用restrict,指針是初始訪問(wèn)該對(duì)象的惟一途 徑。如果使用const,指針始終指向同一個(gè)數(shù)組。使用volatile沒(méi)有任何意義。 5、單行注釋 引入了單行注釋標(biāo)記 "http://" , 可以象C++一樣使用這種注釋了。 6、分散代碼與聲明 7、預(yù)處理程序的修改 ?。帷⒆?cè)斜?br> 宏可以帶變?cè)?,在宏定義中用省略號(hào)(...)表示。內(nèi)部預(yù)處理標(biāo)識(shí)符__VA_ARGS__決定變?cè)獙⒃诤?br>處得到替換。例:#define MySum(...) sum(__VA_ARGS__) 語(yǔ)句MySum(k,m,n); 將被轉(zhuǎn)換成:sum(k, m, n); 變?cè)€可以包含變?cè)?。例?#define compare(compf, ...) compf(__VA_ARGS__) 其中的compare(strcmp,"small", "large"); 將替換成: strcmp("small","large"); ?。?、_Pragma運(yùn)算符 C99引入了在程序中定義編譯指令的另外一種方法:_Pragma運(yùn)算符。格式如下: _Pragma("directive") 其中directive是要滿打滿算的編譯指令。_Pragma運(yùn)算符允許編譯指令參與宏替換。 c、內(nèi)部編譯指令 STDCFP_CONTRACT ON/OFF/DEFAULT 若為ON,浮點(diǎn)表達(dá)式被當(dāng)做基于硬件方式處理的獨(dú)立 單元。默認(rèn)值是定義的工具。 STDCFEVN_ACCESS ON/OFF/DEFAULT 告訴編譯程序可以訪問(wèn)浮點(diǎn)環(huán)境。默認(rèn)值是定義的工具。 STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值為ON,相當(dāng)于告訴編譯程序某程序某些含 有復(fù)數(shù)的公式是可靠的。默認(rèn)是OFF。 ?。?、新增的內(nèi)部宏 __STDC_HOSTED__ 若操作系統(tǒng)存在,則為1 __STDC_VERSION__ 199991L或更高。代表C的版本 __STDC_IEC_599__ 若支持IEC 60559浮點(diǎn)運(yùn)算,則為1 __STDC_IEC_599_COMPLEX__ 若支持IEC 60599復(fù)數(shù)運(yùn)算,則為1 __STDC_ISO_10646__ 由編譯程序支持,用于說(shuō)明ISO/IEC 10646標(biāo)準(zhǔn)的年和月格式: yyymmmL 8、for語(yǔ)句內(nèi)的變量聲明 C99中,程序員可以在for語(yǔ)句的初始化部分定義一個(gè)或多個(gè)變量,這些變量的作用域僅于本for語(yǔ) 句所控制的循環(huán)體內(nèi)。比如: 代碼: for(int i=0; i<10; i++){ // do someting ... } 9、復(fù)合賦值 C99中,復(fù)合賦值中,可以指定對(duì)象類(lèi)型的數(shù)組、結(jié)構(gòu)或聯(lián)合表達(dá)式。當(dāng)使用復(fù)合賦值時(shí),應(yīng)在括弧 內(nèi)指定類(lèi)型,后跟由花括號(hào)圍起來(lái)的初始化列表;若類(lèi)型為數(shù)組,則不能指定數(shù)組的大小。建成的對(duì)象是 未命名的。 例: double *fp = (double[]) {1.1, 2.2, 3.3}; 該語(yǔ)句用于建立一個(gè)指向double的指針fp,且該指針指向這個(gè)3元素?cái)?shù)組的第一個(gè)元素。 在文件 域內(nèi)建立的復(fù)合賦值只在程序的整個(gè)生存期內(nèi)有效。在模塊內(nèi)建立的復(fù)合賦值是局部對(duì)象,在退出模塊后 不再存在。 10、柔性數(shù)組結(jié)構(gòu)成員 C99中,結(jié)構(gòu)中的最后一個(gè)元素允許是未知大小的數(shù)組,這就叫做柔性數(shù)組成員,但結(jié)構(gòu)中的柔性數(shù) 組成員前面必須至少一個(gè)其他成員。柔性數(shù)組成員允許結(jié)構(gòu)中包含一個(gè)大小可變的數(shù)組。sizeof返回的這 種結(jié)構(gòu)大小不包括柔性數(shù)組的內(nèi)存。包含柔性數(shù)組成員的結(jié)構(gòu)用malloc()函數(shù)進(jìn)行內(nèi)存的動(dòng)態(tài)分配,并且 分配的內(nèi)存應(yīng)該大于結(jié)構(gòu)的大小,以適應(yīng)柔性數(shù)組的預(yù)期大小。 11、指定的初始化符 C99中,該特性對(duì)經(jīng)常使用稀疏數(shù)組的程序員十分有用。指定的初始化符通常有兩種用法:用于數(shù)組, 以及用于結(jié)構(gòu)和聯(lián)合。用于數(shù)組的格式:[index] = vol; 其中,index表示數(shù)組的下標(biāo),vol表示本數(shù)組 元素的初始化值。 例如: int x[10] = {[0] = 10, [5] = 30}; 其中只有x[0]和x[5]得到了初始化.用于結(jié)構(gòu)或聯(lián) 合的格式如下: member-name(成員名稱(chēng)) 對(duì)結(jié)構(gòu)進(jìn)行指定的初始化時(shí),允許采用簡(jiǎn)單的方法對(duì)結(jié)構(gòu)中的指定成員進(jìn)行初始化。 例如: struct example{ int k, m, n; } object = {m = 10,n = 200}; 其中,沒(méi)有初始化k。對(duì)結(jié)構(gòu)成員進(jìn)行初始化的順序沒(méi)有限制。 12、printf()和scanf()函數(shù)系列的增強(qiáng) C99中printf()和scanf()函數(shù)系列引進(jìn)了處理long long int和unsigned long long int數(shù)據(jù)類(lèi)型 的特性。long long int 類(lèi)型的格式修飾符是ll。在printf()和scanf()函數(shù)中,ll適用于d, i, o, u 和x 格式說(shuō)明符。另外,C99還引進(jìn)了hh修飾符。當(dāng)使用d, i, o, u和x格式說(shuō)明符時(shí),hh用于指定char 型變?cè)?。ll和hh修飾符均可以用于n說(shuō)明符。 格式修飾符a和A用在printf()函數(shù)中時(shí),結(jié)果將會(huì)輸出十六進(jìn)制的浮點(diǎn)數(shù)。格式如下:[-]0xh, hhhhp + d 使用A格式修飾符時(shí),x和p必須是大寫(xiě)。A和a格式修飾符也可以用在scanf()函數(shù)中,用于讀取 浮點(diǎn)數(shù)。調(diào)用printf()函數(shù)時(shí),允許在%f說(shuō)明符前加上l修飾符,即%lf,但不起作用。 13、C99新增的庫(kù) C89中標(biāo)準(zhǔn)的頭文件 <assert.h> 定義宏assert() <ctype.h> 字符處理 <errno.h> 錯(cuò)誤報(bào)告 <float.h> 定義與實(shí)現(xiàn)相關(guān)的浮點(diǎn)值勤 <limits.h> 定義與實(shí)現(xiàn)相關(guān)的各種極限值 <locale.h> 支持函數(shù)setlocale() <math.h> 數(shù)學(xué)函數(shù)庫(kù)使用的各種定義 <setjmp.h> 支持非局部跳轉(zhuǎn) <signal.h> 定義信號(hào)值 <stdarg.h> 支持可變長(zhǎng)度的變?cè)斜?br> <stddef.h> 定義常用常數(shù) <stdio.h> 支持文件輸入和輸出 <stdlib.h> 其他各種聲明 <string.h> 支持串函數(shù) <time.h> 支持系統(tǒng)時(shí)間函數(shù) C99新增的頭文件和庫(kù) <complex.h> 支持復(fù)數(shù)算法 <fenv.h> 給出對(duì)浮點(diǎn)狀態(tài)標(biāo)記和浮點(diǎn)環(huán)境的其他方面的訪問(wèn) <inttypes.h> 定義標(biāo)準(zhǔn)的、可移植的整型類(lèi)型集合。也支持處理最大寬度整數(shù)的函數(shù) <iso646.h> 首先在此1995年第一次修訂時(shí)引進(jìn),用于定義對(duì)應(yīng)各種運(yùn)算符的宏 <stdbool.h> 支持布爾數(shù)據(jù)類(lèi)型類(lèi)型。定義宏bool,以便兼容于C++ <stdint.h> 定義標(biāo)準(zhǔn)的、可移植的整型類(lèi)型集合。該文件包含在<inttypes.h>中 <tgmath.h> 定義一般類(lèi)型的浮點(diǎn)宏 <wchar.h> 首先在1995年第一次修訂時(shí)引進(jìn),用于支持多字節(jié)和寬字節(jié)函數(shù) <wctype.h> 首先在1995年第一次修訂時(shí)引進(jìn),用于支持多字節(jié)和寬字節(jié)分類(lèi)函數(shù) 14、__func__預(yù)定義標(biāo)識(shí)符 用于指出__func__所存放的函數(shù)名,類(lèi)似于字符串賦值。
15、其它特性的改動(dòng) 放寬的轉(zhuǎn)換限制 限制 C89標(biāo)準(zhǔn) C99標(biāo)準(zhǔn) 數(shù)據(jù)塊的嵌套層數(shù) 15 127 條件語(yǔ)句的嵌套層數(shù) 8 63 內(nèi)部標(biāo)識(shí)符中的有效字符個(gè)數(shù) 31 63 外部標(biāo)識(shí)符中的有效字符個(gè)數(shù) 6 31 結(jié)構(gòu)或聯(lián)合中的成員個(gè)數(shù) 127 1023 函數(shù)調(diào)用中的參數(shù)個(gè)數(shù) 31 127
不再支持隱含式的int規(guī)則 刪除了隱含式函數(shù)聲明 對(duì)返回值的約束 C99中,非空類(lèi)型函數(shù)必須使用帶返回值的return語(yǔ)句. 擴(kuò)展的整數(shù)類(lèi)型 擴(kuò)展類(lèi)型 含義 int16_t 整數(shù)長(zhǎng)度為精確16位 int_least16_t 整數(shù)長(zhǎng)度為至少16位 int_fast32_t 最穩(wěn)固的整數(shù)類(lèi)型,其長(zhǎng)度為至少32位 intmax_t 最大整數(shù)類(lèi)型 uintmax_t 最大無(wú)符號(hào)整數(shù)類(lèi)型 對(duì)整數(shù)類(lèi)型提升規(guī)則的改進(jìn) C89中,表達(dá)式中類(lèi)型為char,short int或int的值可以提升為int或unsigned int類(lèi)型. C99中,每種整數(shù)類(lèi)型都有一個(gè)級(jí)別.例如:long long int 的級(jí)別高于int, int的級(jí)別高于char 等.在表達(dá)式中,其級(jí)別低于int或unsigned int的任何整數(shù)類(lèi)型均可被替換成int或unsigned int類(lèi)型.
|