本篇內(nèi)容主要講解“C語言中的ANSI標(biāo)準(zhǔn)是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C語言中的ANSI標(biāo)準(zhǔn)是什么”吧!
創(chuàng)新互聯(lián)自2013年起,先為西充等服務(wù)建站,西充等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為西充企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
什么是K&R C?
1978年,丹尼斯?里奇(Dennis Ritchie)和布萊恩?柯林漢(Brian Kernighan)合作出版了《C程序設(shè)計(jì)語言》的第一版。書中介紹的C語言標(biāo)準(zhǔn)也被稱作“K&R C”。
什么是ANSI C、ISO C、C89、C90標(biāo)準(zhǔn)?
隨著C語言使用得越來越廣泛,出現(xiàn)了許多新問題,人們?nèi)找鎻?qiáng)烈地要求對C語言進(jìn)行標(biāo)準(zhǔn)化。1983年,美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)組成了一個(gè)委員會(huì),X3J11,為了創(chuàng)立 C 的一套標(biāo)準(zhǔn)。經(jīng)過漫長而艱苦的過程,該標(biāo)準(zhǔn)于1989年完成,這個(gè)版本的語言經(jīng)常被稱作ANSI C,或有時(shí)稱為C89(為了區(qū)別C99)。在1990年,ANSI C標(biāo)準(zhǔn)(帶有一些小改動(dòng))被美國國家標(biāo)準(zhǔn)協(xié)會(huì)(ANSI)采納為ISO/IEC 9899:1990。這個(gè)版本有時(shí)候稱為C90或者ISO C。綜上,ANSI C、ISO C、C89、C90其實(shí)是同一種標(biāo)準(zhǔn)。
什么是C99標(biāo)準(zhǔn)?
2000年3月,ANSI 采納了 ISO/IEC 9899:1999 標(biāo)準(zhǔn)。這個(gè)標(biāo)準(zhǔn)通常指C99。 C99新增了一些特性,如:支持不定長的數(shù)組,即數(shù)組長度可以在運(yùn)行時(shí)決定。變量聲明不必放在語句塊的開頭,for語句提倡寫成for(int i=0;i<100;++i) 的形式,即i只在for語句塊內(nèi)部有效。
什么是C11標(biāo)準(zhǔn)?
C11標(biāo)準(zhǔn)是C語言標(biāo)準(zhǔn)的第三版(2011年由ISO/IEC發(fā)布),前一個(gè)標(biāo)準(zhǔn)版本是C99標(biāo)準(zhǔn)。與C99相比,C11有哪些變化呢?
1、 對齊處理:alignof(T)返回T的對齊方式,aligned_alloc()以指定字節(jié)和對齊方式分配內(nèi)存,頭文件
2、 _Noreturn:_Noreturn是個(gè)函數(shù)修飾符,位置在函數(shù)返回類型的前面,聲明函數(shù)無返回值,有點(diǎn)類似于gcc的__attribute__((noreturn)),后者在聲明語句尾部。
3、 _Generic:_Generic支持輕量級范型編程,可以把一組具有不同類型而卻有相同功能的函數(shù)抽象為一個(gè)接口。
4、 _Static_assert():_Static_assert(),靜態(tài)斷言,在編譯時(shí)刻進(jìn)行,斷言表達(dá)式必須是在編譯時(shí)期可以計(jì)算的表達(dá)式,而普通的assert()在運(yùn)行時(shí)刻斷言。
5、安全版本的幾個(gè)函數(shù):gets_s()取代了gets(),原因是后者這個(gè)I/O函數(shù)的實(shí)際緩沖區(qū)大小不確定,以至于發(fā)生常見的緩沖區(qū)溢出攻擊,類似的函數(shù)還有其它的。
6、 fopen()新模式:fopen()增加了新的創(chuàng)建、打開模式“x”,在文件鎖中比較常用。
7、 匿名結(jié)構(gòu)體、聯(lián)合體。
8、 多線程:頭文件
9、 _Atomic類型修飾符和頭文件
10、改進(jìn)的Unicode支持和頭文件
11、quick_exit():又一種終止程序的方式,當(dāng)exit()失敗時(shí)用以終止程序。
12、復(fù)數(shù)宏,浮點(diǎn)數(shù)宏。
13、time.h新增timespec結(jié)構(gòu)體,時(shí)間單位為納秒,原來的timeval結(jié)構(gòu)體時(shí)間單位為毫秒。
下面看一段程序:
#include
int main(void)
{
// C99允許在for循環(huán)內(nèi)定義循環(huán)變量,而C89不允許
for (int i = 0; i < 5; i++)
{
printf("hello world!\n");
}
return 0;
}
在C89標(biāo)準(zhǔn)下編譯,結(jié)果為:
編譯報(bào)錯(cuò)原因?yàn)?,在C89標(biāo)準(zhǔn)下,循環(huán)變量不能在for循環(huán)內(nèi)定義,必須把標(biāo)準(zhǔn)改為C99標(biāo)準(zhǔn)才可正常編譯。以C99編譯的命令為:
gcc -std=c99 test.c -o test.exe
如下圖,以C99編譯能成功編譯:
所以在平時(shí)的開發(fā)中應(yīng)該要了解編譯器支持什么標(biāo)準(zhǔn)。因?yàn)椋袝r(shí)候編譯出錯(cuò)是因?yàn)楫?dāng)前編譯器支持的標(biāo)準(zhǔn)不同。
GCC編譯器在編譯的時(shí)候可指定C語言標(biāo)準(zhǔn):
指定c90標(biāo)準(zhǔn): -std=c90
指定C99標(biāo)準(zhǔn): -std=c99
定C11標(biāo)準(zhǔn)(目前正在開發(fā)中): -std=c11
到此,相信大家對“C語言中的ANSI標(biāo)準(zhǔn)是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!