溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言中的ANSI標(biāo)準(zhǔn)是什么

發(fā)布時(shí)間:2021-11-23 09:12:00 來源:億速云 閱讀:232 作者:iii 欄目:互聯(lián)網(wǎng)科技

本篇內(nèi)容主要講解“C語言中的ANSI標(biāo)準(zhǔn)是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“C語言中的ANSI標(biāo)準(zhǔn)是什么”吧!

什么是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é)會(ANSI)組成了一個(gè)委員會,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)(帶有一些小改動)被美國國家標(biāo)準(zhǔn)協(xié)會(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)存,頭文件<stdalign.h>定義了這些內(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、 多線程:頭文件<threads.h>定義了創(chuàng)建和管理線程的函數(shù),新的存儲類修飾符_Thread_local限定了變量不能在多線程之間共享。


9、 _Atomic類型修飾符和頭文件<stdatomic.h>。


10、改進(jìn)的Unicode支持和頭文件<uchar.h>。


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 <stdio.h>

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é)果為:

C語言中的ANSI標(biāo)準(zhǔn)是什么

編譯報(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編譯能成功編譯:

C語言中的ANSI標(biāo)準(zhǔn)是什么

所以在平時(shí)的開發(fā)中應(yīng)該要了解編譯器支持什么標(biāo)準(zhǔn)。因?yàn)?,有時(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í)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI