C程序設(shè)計(jì)語言C99標(biāo)準(zhǔn)_第1頁
C程序設(shè)計(jì)語言C99標(biāo)準(zhǔn)_第2頁
C程序設(shè)計(jì)語言C99標(biāo)準(zhǔn)_第3頁
C程序設(shè)計(jì)語言C99標(biāo)準(zhǔn)_第4頁
C程序設(shè)計(jì)語言C99標(biāo)準(zhǔn)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、ISO/IEC標(biāo)準(zhǔn)9899:1999 C程序設(shè)計(jì)語言(即C99標(biāo)準(zhǔn))原文:收藏原著:ISO/IEC標(biāo)準(zhǔn)委員會翻譯:lover_P出處:本站聲明    本文為本人所收藏之C99標(biāo)準(zhǔn),私自將其譯出僅為自己學(xué)習(xí)方便,放在這里也只為有興趣的朋友一同學(xué)習(xí),如果您將本文下載到自己的存貯設(shè)備中進(jìn)行學(xué)習(xí),請務(wù)必在學(xué)習(xí)完畢后立即將其刪除,以避免不必要的麻煩!如果本文侵犯了您任何權(quán)利,請通知我,我將立即將本文從此站點(diǎn)上徹底刪除。內(nèi)容· 前言 · 概述 · 1 范疇 · 2 參考標(biāo)準(zhǔn) · 3 術(shù)語、定義和符號 · 4 一致性前

2、言    ISO(國際標(biāo)準(zhǔn)化組織,International Organization for Standardization)和IEC(國際電子委員會,International Electrotechnical Commission)構(gòu)成制定國際標(biāo)準(zhǔn)的特定系統(tǒng)。ISO或IEC的成員通過分散的組織建立的技術(shù)委員會處理技術(shù)活動中的特定部分,一同開發(fā)國際標(biāo)準(zhǔn)。ISO和IEC合并有共同利益的領(lǐng)域。其他國際組織、政府和非政府組織通過與ISO和IEC聯(lián)絡(luò),一同參加到工作中。    國際標(biāo)準(zhǔn)的草案與ISO/IEC指示的第三部分所給出的規(guī)則相一致

3、。    在信息技術(shù)領(lǐng)域,ISO和IEC建立了一個聯(lián)合技術(shù)委員會ISO/IEC JTC 1。聯(lián)合技術(shù)委員會所提供的國際標(biāo)準(zhǔn)草案由各成員輪流投票。能夠發(fā)表的國際標(biāo)準(zhǔn)必須有75%的成員投贊成票。    國際標(biāo)準(zhǔn)ISO/IEC9899由聯(lián)合技術(shù)委員會ISO/IEC JTC 1,信息技術(shù)組,子委員會SC 22,“程序設(shè)計(jì)語言,環(huán)境和系統(tǒng)接口”準(zhǔn)備。這個工作組負(fù)責(zé)在站點(diǎn)http:/www.dkuug.dk/JTC1/SC22/WG14/上維護(hù)這個標(biāo)準(zhǔn),包括與該標(biāo)準(zhǔn)相關(guān)的附加信息,如在準(zhǔn)備這個標(biāo)準(zhǔn)的過程中很多決定的基本原理和錯誤報告日志以及反饋。

4、    該第二版取消并取代第一版ISO/IEC 9899:1990,作為ISO/IEC 9899/COR1:1994、ISO/IEC 9899/AMD1:1995和ISO/IEC 9899/COR2:1996的修訂版和正確版。自前一版本以來的主要改變包括:· 通過同音字和<iso646.h>限制字符集支持(最初由AMD1指定) · 在<wchar.h>和<wctype.h>中支持寬字符庫 · 通過有效的類型得到的更準(zhǔn)確的別名規(guī)則 · 受限的指針 · 變長數(shù)組 · 靈活的

5、數(shù)組成員 · 參數(shù)數(shù)組聲明中的static和類型修飾符 · <complex.h>中支持的復(fù)數(shù)(和虛數(shù)) · <tgmath.h>中的泛型類型數(shù)學(xué)宏 · long long int類型和庫函數(shù) · 增強(qiáng)的轉(zhuǎn)換極限 · <float.h>中的附加浮點(diǎn)特性 · 取消了隱含的int · 可靠的整數(shù)除法 · 通用字符名稱(u和U) · 擴(kuò)展的標(biāo)識符 · 十六進(jìn)制浮點(diǎn)常數(shù)以及%a和%A printf/scanf轉(zhuǎn)義說明 · 復(fù)合的字面值 ·

6、 指定的初始化器 · /注釋 · <inttypes.h>和<stdint.h>中的擴(kuò)展整數(shù)類型和庫函數(shù) · 取消了隱式函數(shù)聲明 · 由處理器完成intmax_t/uintmax_t的計(jì)算 · 混合的聲明和代碼 · 選擇和迭代語句的新的塊作用域 · 整數(shù)常量類型規(guī)則 · 整數(shù)提升規(guī)則 · 變長參數(shù)宏 · <stdio.h>和<wchar.h>中的vscanf函數(shù)族 · <math.h>中的附加的庫函數(shù) · <f

7、env.h>中的浮點(diǎn)環(huán)境訪問 · 對IEC 60559(以及著名的IEC 559或IEEE算法)的支持 · enum聲明中允許的后綴逗號 · printf中允許的%lf轉(zhuǎn)義說明符 · 內(nèi)聯(lián)(inline)函數(shù) · <stdio.h>中的snprintf函數(shù)族 · <stdbool.h>中的布爾類型 · 冪類型限定符 · 空的宏參數(shù) · 新的結(jié)構(gòu)類型兼容性規(guī)則(為了兼容性) · 附加的預(yù)定義宏名 · _Pragma預(yù)處理運(yùn)算符 · 標(biāo)準(zhǔn)實(shí)現(xiàn)(sta

8、ndard pragma) · _func_預(yù)定義標(biāo)識符 · VA_COPY宏 · 附加的strftime轉(zhuǎn)換說明符 · LIA兼容性附件 · 在二進(jìn)制文件開頭拒絕ungetc · 不再拒絕為數(shù)組參數(shù)取別名    附錄D和F是這個標(biāo)準(zhǔn)的規(guī)范性部分;附錄A、B、C、E、G、H、I、J參考文獻(xiàn)和索引僅僅是信息性的。與ISO/IEC指示的第三部分一致,該前言、概述、注解、腳注和示例均僅為信息性的。概述    隨著新設(shè)備的引入和字符集的擴(kuò)展,改標(biāo)準(zhǔn)會隨時添加新的特性。語言和庫條款中的

9、字條款提醒使用它的實(shí)現(xiàn)者和開發(fā)者,盡管它們現(xiàn)在是有效的,但和可能在將來的擴(kuò)增中無效。    某些特性標(biāo)記為廢除,這意味著在該國際標(biāo)準(zhǔn)未來的修訂版中將考慮刪除它們。保留它們是因?yàn)樗鼈儽粡V泛地使用,但不支持在新的實(shí)現(xiàn)(對于實(shí)現(xiàn)特性來講)或新的程序(對于語言6.11或庫特性7.26來講)中使用它們。    該國際標(biāo)準(zhǔn)被分為四個主要部分:· 預(yù)備原理(第一章至第四章); · 翻譯和執(zhí)行C程序的環(huán)境的特征(第五章) · 語言的語法、約束和語義(第六章) · 庫工具(第七章)  

10、0; 示例用于闡明所描述的構(gòu)造的可能的形式。腳注用于強(qiáng)調(diào)當(dāng)前章節(jié)或該國家標(biāo)準(zhǔn)中其他地方所描述之規(guī)則的重點(diǎn)。參考用于引用其它相關(guān)章節(jié)。建議用于為實(shí)現(xiàn)者提供建議或指導(dǎo)。附錄用于提供附加信息和總結(jié)該國際標(biāo)準(zhǔn)中包含的信息。在該標(biāo)準(zhǔn)的準(zhǔn)備階段引用了一個參考書目列表文檔。    語言條款(第六章)得自The C Reference Manual (C語言參考手冊)。    庫條款(第七章)基于1984/usr/group Standard。1 范疇    該國際標(biāo)準(zhǔn)制定了用C語言書寫的程序的形式并為其確定一個解釋1。

11、它指定了:· C程序的表示法; · C語言的語法和約束; · C程序的語義規(guī)則和解釋; · C程序處理的輸入數(shù)據(jù)的表示法; · C程序處理的輸出數(shù)據(jù)的表示法; · 一個符合該標(biāo)準(zhǔn)的C實(shí)現(xiàn)所強(qiáng)制的限制和極限。    該國際標(biāo)準(zhǔn)未指定:· 通過一個數(shù)據(jù)處理系統(tǒng)對C程序進(jìn)行轉(zhuǎn)換的機(jī)制; · 通過一個數(shù)據(jù)處理系統(tǒng)對C程序進(jìn)行調(diào)用的機(jī)制; · C程序轉(zhuǎn)換輸入數(shù)據(jù)的機(jī)制; · C程序?qū)Ξa(chǎn)生的輸出數(shù)據(jù)的轉(zhuǎn)換機(jī)制; · 程序的復(fù)雜度大小及其數(shù)據(jù)是否超出了一個特定的數(shù)據(jù)處理

12、系統(tǒng)的能力或一個具體的處理器的能力; · 數(shù)據(jù)處理系統(tǒng)的最小要求是否要支持一個符合該標(biāo)準(zhǔn)的實(shí)現(xiàn)。2 參考標(biāo)準(zhǔn)    本文引用了下列標(biāo)準(zhǔn)文檔中的某些條款,從而形成該國際標(biāo)準(zhǔn)的條款。對于過期的引用,該文檔不再引用其之后的改正版和修訂版。然而,鼓勵基于該國際標(biāo)準(zhǔn)的團(tuán)體研究使用下面列出的這些文檔的最新的版本的可能性。對于未過期的引用,應(yīng)用該標(biāo)準(zhǔn)文檔的最近的版本。ISO和IEC的成員維護(hù)當(dāng)前可用的國際標(biāo)準(zhǔn)的記錄。ISO 31-11:1992, Quantities and units Part 11: Mathematical signs and symbols

13、for use in the physical sciences and technology.ISO/IEC 646, Information technology ISO 7-bit coded character set for information interchange.ISO/IEC 2382-1:1993, Information technology Vocabulary Part 1: Fundamental terms.ISO 4217, Codes for the representation of currencies and funds.ISO 8601, Data

14、 elements and interchange formats Information interchange Representation of dates and times.ISO/IEC 10646 (all parts), Information technology Universal Multiple-Octet Coded Character Set (UCS).IEC 60559:1989, Binary floating-point arithmetic for microprocessor systems (previously designated IEC 559:

15、1989).3 術(shù)語、定義和符號    該國際標(biāo)準(zhǔn)使用了如下定義。其他術(shù)語在其出現(xiàn)的位置以斜體顯示,或放在語法規(guī)則的左側(cè)。該國際標(biāo)準(zhǔn)中顯式定義的術(shù)語不被假設(shè)引用了其它地方隱式地聲明的類似的術(shù)語。該國際標(biāo)準(zhǔn)中未定義的術(shù)語依據(jù)ISO/IEC 2382-1中的解釋。該國際標(biāo)準(zhǔn)中未定義的數(shù)學(xué)符號依據(jù)ISO 31-11中的解釋。內(nèi)容· 3.1 訪問(access) · 3.2 對齊(alignment) · 3.3 自變量(argument) · 3.4 行為(behavior) o 3.4.1 實(shí)現(xiàn)定義的行為(implementat

16、ion-defined behavior) o 3.4.2 區(qū)域指定行為(locale-specific behavior) o 3.4.3 未定義行為(undefined behavior) o 3.4.4 未指定行為(unspecified behavior)· 3.5 位(bit) · 3.6 字節(jié)(byte) · 3.7 字符(character) o 3.7.1 單字節(jié)字符(single-byte character) o 3.7.2 多字節(jié)字符(multi-byte character) o 3.7.3 寬字符(wide character)·

17、; 3.8 約束(constraint) · 3.9 恰當(dāng)?shù)厣崛氲慕Y(jié)果(correctly rounded result) · 3.10 診斷消息(diagnostic message) · 3.11 向前引用(forward reference) · 3.12 實(shí)現(xiàn)(implementation) · 3.13 實(shí)現(xiàn)極限(implementation limit) · 3.14 對象(object) · 3.15 參數(shù)(parameter) · 3.16 推薦的實(shí)踐(recommended practice) &

18、#183; 3.17 值(value) o 3.17.1 實(shí)現(xiàn)定義的值(implementation-defined value) o 3.17.2 不確定的值(indeterminate value) o 3.17.3 未指定的值(unspecified value)· 3.18 x · 3.19 x 3.1 訪問(access)    <運(yùn)行時動作>讀取或修改一個對象的值    注解1 該動作只表示一個動作,“讀?。╮ead)”或“修改(modify)”。    注解2

19、 “修改”包括被存貯的新值與原值相同的情況。    注解3 未求值的表達(dá)式不訪問對象。3.2 對齊(alignment)    一個特定類型的對象的存貯地址必須是一個字節(jié)地址的特定倍數(shù)的地址的要求3.3 自變量(argument)    實(shí)際自變量    實(shí)際參數(shù)(不推薦)    一個函數(shù)調(diào)用表達(dá)式中由圓括號包圍的、由逗號分隔的表達(dá)式列表,或函數(shù)宏調(diào)用中有圓括號包圍的、由逗號分隔的預(yù)處理記號序列3.4 行為(behavior) 

20、0;  外部表現(xiàn)或動作3.4.1 實(shí)現(xiàn)定義的行為(implementation-defined behavior)    未指定的行為,由每種實(shí)現(xiàn)的文檔做出選擇    例 關(guān)于實(shí)現(xiàn)定義的行為的一個示例是在一個帶符號整數(shù)向右移位時高次位的傳播。3.4.2 區(qū)域指定行為(locale-specific behavior)    每個實(shí)現(xiàn)文檔中說明的依賴國家、文化和語言的區(qū)域習(xí)俗的行為    例 關(guān)于區(qū)域指定行為的一個例子是islower函數(shù)值對于除了26個小寫拉丁字母之

21、外的其它字符是否為真。3.4.3 未定義行為(undefined behavior)    使用該國際標(biāo)準(zhǔn)未強(qiáng)制要求的不便的或錯誤的程序構(gòu)造、錯誤的數(shù)據(jù)時的行為    注解 可能的未定義行為包括從忽略帶有完全未知結(jié)果的情形,到翻譯或程序的執(zhí)行在一個環(huán)境的文檔風(fēng)格特征中(有或沒有一個診斷信息),到翻譯或執(zhí)行的終結(jié)(帶有一個診斷信息)。    例 未定義行為的一個示例是整數(shù)上溢時的行為。3.4.4 未指定行為(unspecified behavior)    該國際標(biāo)準(zhǔn)提供了兩種

22、或更多種可能性的和未強(qiáng)制更多要求、可以選擇任何實(shí)例的行為    例 未指定行為的一個示例是函數(shù)參數(shù)的求值順序3.5 位(bit)    數(shù)據(jù)存貯單位,在執(zhí)行環(huán)境中表示一個僅有兩個值之一的足夠大的對象單位    注解 不需要能夠表示一個對象的每一個有效位的地址3.6 字節(jié)(byte)    可編址的(addressable)數(shù)據(jù)存貯單位,能夠表示執(zhí)行環(huán)境中的基本字符集中的任意成員的足夠大的對象單位    注解1 可以唯一地表示一個對象的每一個有效字

23、節(jié)的地址。    注解2 一個字節(jié)由一個相鄰的位序列構(gòu)成,其數(shù)量是由實(shí)現(xiàn)定義的。3.7 字符(character)    <概念>用于組織、控制或表示數(shù)據(jù)的一組元素的成員3.7.1 單字節(jié)字符(single-byte character)    <C>位數(shù)符合一個字節(jié)3.7.2 多字節(jié)字符(multi-byte character)    表示源代碼或執(zhí)行環(huán)境的擴(kuò)展字符集中的一個成員的一個或多個字節(jié)的序列    注解 擴(kuò)展

24、字符集是基本字符集的超集3.7.3 寬字符(wide character)    位數(shù)符合一個wchar_t類型的對象,能夠表示當(dāng)前區(qū)域中的任意字符3.8 約束(constraint)    限制,既有句法的又有語義的,語言元素的說明通過它進(jìn)行解釋3.9 恰當(dāng)?shù)厣崛氲慕Y(jié)果(correctly rounded result)    結(jié)果的最接近的值的表示,服從有效的舍入模式,該結(jié)果為給定限制范圍和精度3.10 診斷消息(diagnostic message)    屬于由實(shí)現(xiàn)定

25、義的實(shí)現(xiàn)消息輸出的一個子集3.11 向前引用(forward reference)    引用該國際標(biāo)準(zhǔn)中稍后的一個子條款,該子條款包含了與當(dāng)前子條款相關(guān)的附加信息3.12 實(shí)現(xiàn)(implementation)    軟件的特定集合,運(yùn)行在特定控制選項(xiàng)下的特定翻譯環(huán)境中,在一個特定的執(zhí)行環(huán)境中執(zhí)行程序的翻譯和對運(yùn)行的支持3.13 實(shí)現(xiàn)極限(implementation limit)    由實(shí)現(xiàn)強(qiáng)加于程序的限制3.14 對象(object)    執(zhí)行環(huán)境中的數(shù)據(jù)存貯區(qū)域,其

26、內(nèi)容可以表示一些值    注解 所提到的一個對象可能具有一個特定的類型;參見。3.15 參數(shù)(parameter)    形式參數(shù)    形式自變量(不推薦)    作為一個函數(shù)聲明一部分的對象聲明或從函數(shù)入口處獲得一個值的定義,或者是函數(shù)宏定義中緊跟宏名的一個由圓括號包圍、由逗號分隔的標(biāo)識符列表3.16 推薦的實(shí)踐(recommended practice)    強(qiáng)烈推薦的規(guī)范以保證該標(biāo)準(zhǔn)的意圖,但有些實(shí)現(xiàn)可能不遵守3.17 值

27、(value)    被說明具有一定類型的對象的內(nèi)容的精確意義3.17.1 實(shí)現(xiàn)定義的值(implementation-defined value)    未指定的值,由實(shí)現(xiàn)做出選擇3.17.2 不確定的值(indeterminate value)    或者是未指定的值或者是陷阱表示3.17.3 未指定的值(unspecified value)    相關(guān)類型的有效值,該表專對任何實(shí)現(xiàn)所選擇的值為作強(qiáng)制要求    注解 一個未指定的值不能使一個

28、陷阱表示3.18 x     x的上限:大于或等于x的最小整數(shù)    例 2.4 是3, -2.4 是-2。3.19 x     x的下限:小于或等于x的最大整數(shù)    例 2.4 是2, -2.4 是-34 一致性*    *譯注:conformance,亦稱“相容性”或“符合性”。    在該國際標(biāo)準(zhǔn)中,“應(yīng)當(dāng)”被解釋為一個實(shí)現(xiàn)或一個程序的要求;反之,“不應(yīng)當(dāng)”則是被禁止的。   

29、如果違反了一個約束所要求的“應(yīng)當(dāng)”或“不應(yīng)當(dāng)”,則其行為是未定義的。在該國際標(biāo)準(zhǔn)中,為定義行為以詞組“未定義行為”表示,或者其它行為的顯式定義之外的缺省表示。這三種說法的重點(diǎn)沒有什么不同,它們都表示“這個行為是沒有定義的”。    一個在其它所有方面都正確的、能夠作用于正確數(shù)據(jù)的、能夠容忍為定義行為的程序?qū)⑹且粋€正確的程序,并可以按照執(zhí)行。    一個實(shí)現(xiàn)不應(yīng)當(dāng)成功翻譯一個包含了#error預(yù)處理指令的預(yù)處理翻譯單元,除非這一部分代碼被條件包含所跳過。    一個嚴(yán)格一致的程序(strict

30、ly conforming program)應(yīng)當(dāng)僅使用該國際標(biāo)準(zhǔn)所指定的語言特性和庫2。 它不應(yīng)當(dāng)產(chǎn)生任何依賴未指定的、未定義的或?qū)崿F(xiàn)定義行為的輸出,并且不應(yīng)當(dāng)超出任何最小實(shí)現(xiàn)限制。    一致的實(shí)現(xiàn)(conforming implementation)的兩種形式是宿主(hosted)實(shí)現(xiàn)和獨(dú)立(freestanding)實(shí)現(xiàn)。一個一致的宿主實(shí)現(xiàn)(conforming hosted implementation)應(yīng)當(dāng)接受任何嚴(yán)格一致的程序,一個一致的獨(dú)立實(shí)現(xiàn)(conforming freestanding implementation)應(yīng)當(dāng)接受一個沒有使用復(fù)雜類型

31、的嚴(yán)格一致的程序,并且該程序中所使用的由庫章節(jié)(第7章)所指定的特性被限制在標(biāo)準(zhǔn)頭文件<float.h>、<iso646.h>、<limits.h>、<stdarg.h>、<stdbool.h>、<stddef.h>和<stdint.h>的內(nèi)容中。 一個一致的實(shí)現(xiàn)可以具有擴(kuò)展(包括附加庫函數(shù)),但這些不應(yīng)當(dāng)改變?nèi)魏螄?yán)格一致的程序的行為3。    一個一致的程序(conforming program)是一個一致的實(shí)現(xiàn)可接受的程序4。    一個實(shí)現(xiàn)應(yīng)當(dāng)伴

32、隨著一個文檔,該文檔定義了所有實(shí)現(xiàn)定義的和區(qū)域相關(guān)的特性以及所有的擴(kuò)展。向前引用    條件包含(6.10.1)、錯誤檢測(6.10.5)、浮點(diǎn)類型特征<float.h>(7.7)、替換拼寫<iso646.h>(7.9)、整數(shù)類型大小<limits.h>(7.10)、可變參數(shù)<stdarg.h>(7.15)、布爾類型和值<stdbool.h>(7.16)、公共定義<stddef.h>(7.17)、整數(shù)類型<stdint.h>(7.18)。您的 C 代碼符合標(biāo)準(zhǔn)嗎?Peter See

33、bach自由作家2004 年 4 月 C99 是什么?誰需要它?它可用了嗎?Poter Seebach 討論了 ISO C 標(biāo)準(zhǔn)的 1999 年修訂版,著重于 Linux 和 BSD 系統(tǒng)上新特性的可用性。C-ninety-what?C99 標(biāo)準(zhǔn)是 ISO C 標(biāo)準(zhǔn)的最新修訂版本?;蛟S應(yīng)該先介紹一些歷史背景。在早期,C 語言的開發(fā)沒有組織,經(jīng)歷了很多變化。最后,大部分廠家都接受了 Kernighan 和 Ritchie 的 The C Programming Language 第一版 (1978) 中描述的語言,但是擴(kuò)展還是司空見慣。ANSI 開始致力于基于此書和現(xiàn)有實(shí)際應(yīng)用之上的標(biāo)準(zhǔn),到 1

34、989-1990 時,一個標(biāo)準(zhǔn)得到了廣泛的使用。這個標(biāo)準(zhǔn)就是廣泛流傳的“C89”;有些人戲稱在 K&R 的 1978 版中描述的語言為“C78”。在接下來的十年,編譯器廠商不斷開發(fā)新擴(kuò)展和新特性,并在 1999 年發(fā)布了修訂的標(biāo)準(zhǔn),這個標(biāo)準(zhǔn)描述了多年來所做的對眾多最有用和廣為支持的新特性所進(jìn)行的標(biāo)準(zhǔn)化工作。這個標(biāo)準(zhǔn)經(jīng)常被叫做“C99”標(biāo)準(zhǔn)。 開放源代碼操作系統(tǒng)所帶的 gcc 發(fā)行版本并不支持 C99 的所有新特性,不過現(xiàn)在已經(jīng)有足夠多的新特性普遍可用,因此有理由開始認(rèn)真考慮在新的開發(fā)中采用 C99 特性,尤其是用在它們使得效率和清晰度本質(zhì)上發(fā)生變化的那些地方。本文回顧了近來發(fā)布的 Li

35、nux 和 BSD 上的 C99 語言和庫特性的可用性。由于這些特性很多是 gcc 的標(biāo)準(zhǔn)特性,所以新版本的 gcc 在大部分其他平臺上可以做同樣的事情。當(dāng)然,各個發(fā)行版本或者各個 OS 之間的庫支持是不同的。以語言標(biāo)準(zhǔn)調(diào)用 gccGNU C 編譯器支持許多不同版本的 C 編程語言??梢栽诿钚猩贤ㄟ^ -std 選項(xiàng)來選擇所使用的 C 標(biāo)準(zhǔn)的版本。默認(rèn)選擇的不是任何版本的標(biāo)準(zhǔn),而是“GNU C”語言,這門語言有其自己的擴(kuò)展集。 C 標(biāo)準(zhǔn)的常見版本用下面的選項(xiàng)選擇: · -std=c89 或 -std=iso9899:1990 · 最初的 C89 標(biāo)準(zhǔn) · -std

36、=iso9899:199409 · C89,增加了 Normative Addendum 1 的變化 · -std=c99 or -std=iso9899:1999 · C99 修訂版標(biāo)準(zhǔn) 使用 -pedantic 選項(xiàng)來強(qiáng)制遵從某個版本的標(biāo)準(zhǔn)。這個選項(xiàng)主要用于設(shè)法確保您的代碼遷移到其他編譯器時仍可用;例如,如果您正在與不使用 gcc 的人共享一個代碼庫 (codebase),您可能希望它在任何時候都能用。注意, -pedantic 標(biāo)記偶而將會得到給定的標(biāo)準(zhǔn)錯誤的一些詳細(xì)信息;例如,它可能試圖在 C99 程序上強(qiáng)制執(zhí)行 C89 規(guī)則,或者可能會在強(qiáng)制執(zhí)行模糊的規(guī)

37、則時失敗。還是值得用它來做測試。如果您正在嘗試編寫可移植代碼,應(yīng)該好好研究一下 -std=c99 -pedantic -Wall 。 C89 標(biāo)準(zhǔn)引入了一個新概念;“獨(dú)立的 (freestanding)”和“托管的 (hosted)”環(huán)境之間的區(qū)別。多數(shù)人都很熟悉托管的環(huán)境;它提供了完整的標(biāo)準(zhǔn)庫,并總是從 main() 開始執(zhí)行。如果您需要獨(dú)立環(huán)境所包含的稍有不同的警告與行為集合,那么使用 -ffreestanding 選項(xiàng)。默認(rèn)地是假定為托管的環(huán)境。為了解決常見的 FAQ,gcc 會故意在 main() 聲明使用的參數(shù)或返回類型不是標(biāo)準(zhǔn)中所列出的類型時給出警告;而 C99 標(biāo)準(zhǔn)允許實(shí)現(xiàn)提供另

38、外的聲明,但是這些實(shí)現(xiàn)是永遠(yuǎn)不可移植的。尤其是,通常以 void 為返回類型聲明 main() 的習(xí)慣是完全錯誤的。(這就是 NetBSD 內(nèi)核使用 -ffreestanding 標(biāo)記來編譯的原因。) 語言特性C 編程語言有兩個容易混淆的部分:語言和庫。以前,有很多通用工具代碼,大家都傾向于重復(fù)使用,這些代碼最后被標(biāo)準(zhǔn)化為標(biāo)準(zhǔn) C 庫。最初這一區(qū)別非常容易理解:如果要進(jìn)行編譯,那么就是語言,如果是在附加代碼中,那么就是庫。事易時移,這個區(qū)別變得模糊了。例如,一些編譯器會生成對外部庫的調(diào)用以進(jìn)行 64 位運(yùn)算,同時一些庫函數(shù)可能會由編譯器不可思議地處理。本文遵循標(biāo)準(zhǔn)的術(shù)語進(jìn)行區(qū)分,即來自標(biāo)準(zhǔn)的“

39、庫”部分的特性是庫特性,在文章的下一節(jié)將討論這些特性。本節(jié)討論除此之外的所有內(nèi)容。 C99 語言引入了許多可能會引起軟件開發(fā)人員興趣的新特性。這些特性中有很多類似于 C 擴(kuò)展的 GNU C 集的特性;不幸的是,在一些情況下,它們并不是很兼容。已經(jīng)增加了一些在 C+ 中常見的特性。具體來說,/ 注釋、混合聲明和混合代碼已經(jīng)成為 C99 的標(biāo)準(zhǔn)特性。這些在 GNU C 中一直都有,應(yīng)該在每一個平臺都可用。不過,總的來說,C 和 C+ 仍是單獨(dú)的語言;C99 與 C+ 的兼容性比 C89 要稍差一些。無論何時,試圖去編寫混合的代碼都不是好主意。好的 C 代碼將是不好的 C+ 代碼。C99 增加了一些

40、對 Unicode 字符(既包括字符串文字內(nèi)的字符,也包括標(biāo)識符內(nèi)的字符)的支持,實(shí)際上,大部分用戶并不需要系統(tǒng)對此的支持;現(xiàn)在還不要期望使用這種字符的源代碼可以對其他人可用。一般而言,寬字符和 unicode 支持主要體現(xiàn)在編譯器中,但是文本處理工具還沒有達(dá)到標(biāo)準(zhǔn)。新的變長數(shù)組(variable-length array,VLA)已經(jīng)部分可用??梢杂煤唵蔚?VLA。不過,這純粹是一個巧合;實(shí)際上,GNU C 有其自己的變長數(shù)組支持。結(jié)果,雖然使用變長數(shù)組的簡單代碼將可以工作,但是大量的代碼會遇到舊的 GNU C 對 VLA 的支持與 C99 定義之間在在差異的麻煩??梢月暶鏖L度為本地變量的數(shù)

41、組,但是就到此為止吧。復(fù)合文字和指定的初始化程序是非常好的代碼可維護(hù)性特性。比較下面兩個代碼片斷:清單 1. 在 C89 中延遲 n 微秒 /* C89 */ struct timeval tv = 0, n ; select(0, 0, 0, 0, &tv); 清單 2. 在 C99 中延遲 n 微秒 / C99 select(0, 0, 0, 0, & (struct timeval) .tv_usec = n );復(fù)合文字的語法允許用大括號括起來的一系列值來初始化適當(dāng)類型的自動對象。每一次運(yùn)行到對象的聲明時它會被初始化,所以使用可能會修改相應(yīng)對象的函數(shù)(比如一些版本的 s

42、elect )時這樣做是安全的。指定的初始化程序語法允許您通過名字初始化成員,不用理會它們在對象中出現(xiàn)的順序。當(dāng)對象龐大而復(fù)雜卻只有很少成員需要初始化時,這特別有用。使用普通的聚合初始化程序時,缺少的值會被認(rèn)為它們已經(jīng)被初始化程序指定為 0 來處理。其他初始化規(guī)則稍有修改;例如,現(xiàn)在您可以在 enum 聲明后跟一個逗號,以更輕松地編寫代碼生成器。 多年來,人們一直在爭論 C 的類型系統(tǒng)的擴(kuò)展,比如 long long 。C99 引入了幾個新的整數(shù)類型。應(yīng)用最廣的是 long long 。標(biāo)準(zhǔn)方法引入的另一種類型是 intmax_t 。這兩種類型在 gcc 中都可以用。不過,整數(shù)提升規(guī)則對于比

43、long 更大的類型并不總是正確??赡茏詈糜蔑@式的類型轉(zhuǎn)換。 還有很多類型,允許對期望的性質(zhì)進(jìn)行更為詳細(xì)的描述。例如,有的類型的名字是 int_least8_t ,它至少有 8 位,還有 int32_t ,它恰好是 32 位。標(biāo)準(zhǔn)保證至少可以訪問 8 位、16 位、32 位和 64 位類型。沒有保證會提供精確寬度類型。不要使用這種類型,除非您肯定是實(shí)在不能接受更大的類型。另一個可選的類型是新的 intptr_t 類型,它是一個足夠大的可以容納一個指針的整數(shù)。并不是所有的系統(tǒng)都提供這樣一種類型(盡管當(dāng)前所有的 Linux 和 BSD 實(shí)現(xiàn)都提供)。 C 預(yù)處理程序有很多新特性;它允許空參數(shù),支持

44、參數(shù)數(shù)量可變的宏,有一個用于宏生成程序的 _Pragma 操作符,還有一個 _func_ 宏,它的內(nèi)容始終是當(dāng)前函數(shù)的名字。這些特性在當(dāng)前版本的 gcc 中都已經(jīng)有了。 C99 增加了 inline 關(guān)鍵字以支持函數(shù)內(nèi)聯(lián)。GNU C 也支持這一關(guān)鍵字,但是在語義上略有不同。如果您正在使用 gcc,而且如果您期望代碼有與 C99 相同的行為,您應(yīng)該記住在內(nèi)聯(lián)函數(shù)前使用 static 關(guān)鍵字。這在以后的修訂中可能會解決,同時,您可以將 inline 作為一個編譯技巧,但不要依賴于確切的語義。 C99 引入了一個限定詞 restrict ,它可以向編譯器給出關(guān)于指針的優(yōu)化提示。因?yàn)榫幾g器不需要對它做

45、任何事,所以只是因?yàn)?gcc 接受了它才引入它。優(yōu)化的程度不同。用它是安全的,但是還不要希望它可以帶來多大的改變。根據(jù)相關(guān)的注解,新的類型別名 (type-aliasing) 規(guī)則已經(jīng)在 gcc 中得到了完全的支持。這通常意味著您必須要更加留心類型的雙義性,它幾乎總會去調(diào)用不明確的行為,除非您用來訪問錯誤類別數(shù)據(jù)的類型是 unsigned char 。 作為函數(shù)參數(shù)的數(shù)組聲明符現(xiàn)在與指針聲明符有了很大意義上的不同;您可以插入類型限定詞。尤其有意思的是給數(shù)組聲明增加 了 static 類型修飾符,這是非常古怪的優(yōu)化提示??催@個聲明: int foo(int astatic 10); 用一個沒有指

46、向至少 10 個 int 類型對象的指針去調(diào)用 foo() 是不明確的行為。這是一種優(yōu)化技巧。您這樣做是向編譯器保證傳遞給那個函數(shù)的參數(shù)將至少是那么大;有一些機(jī)器可能會以此來拆解循環(huán)。老手應(yīng)該會很清楚,它不是一個新的 C 標(biāo)準(zhǔn),因?yàn)樗鼪]有給予 static 關(guān)鍵字全新的含義。 最后一個特性是靈活的數(shù)組成員。有一個常見的聲明結(jié)構(gòu)體的問題,可能會期望這個結(jié)構(gòu)體由一個頭以及接下來的一些數(shù)據(jù)類型構(gòu)成。不幸的是,由于不能給結(jié)構(gòu)體一個指向獨(dú)立分配區(qū)域的指針,C89 沒有提供好的解決方法。兩個常見的解決方案包括,聲明一個成員只占一字節(jié)存儲空間,然后分配額外的超出數(shù)組邊界的空間,或者聲明一個成員要占用比您可能

47、需要的更多的空間,等待分配,而且要小心只去使用可用的存儲空間。這兩種方案對一些編譯器來說都會有問題,所以 C99 為此引入了一個新語法:清單 3. 具有靈活數(shù)組的結(jié)構(gòu)體 struct header size_t len; unsigned char data; ;這種結(jié)構(gòu)體的有用之處在于,如果您分配 (sizeof(struct header) + 10) 字節(jié)的空間,您可以像處理一個 10 字節(jié)的數(shù)組一樣來處理數(shù)據(jù)。這個新語法在 gcc 中也得到了支持。庫特性這對編譯器來說是很好的。那么標(biāo)準(zhǔn)庫如何呢?基于現(xiàn)有的實(shí)踐,尤其是來源于 BSD 和 Linux 社區(qū)的實(shí)踐,C99 中增加了很多庫特性

48、。所以,這些特性中很多是在 Linux 和 BSD 標(biāo)準(zhǔn)庫中已經(jīng)可以找到的。這些特性中很多只是簡單的工具函數(shù);幾乎所有特性原則上都可以在輕便的代碼中完成,但有很多是特別難的。C99 中增加的最方便的特性在 printf 函數(shù)家族中。首先, v*scanf 函數(shù)成為了標(biāo)準(zhǔn); scanf 家族的每一個成員都有一個相應(yīng)的 v*scanf 函數(shù),這些函數(shù)使用一個 va_list 參數(shù)而不是可變的參數(shù)列表。這些函數(shù)的角色與 v*printf 函數(shù)相同,允許用戶自定義獲取可變參數(shù)列表的函數(shù),并最終調(diào)用 printf 或 scanf 家族中的函數(shù)來完成復(fù)雜的工作。 其次,引入了 4.4BSD 的 snpri

49、ntf 函數(shù)家族。 snprintf 函數(shù)讓您可以安全地輸出到固定大小的緩沖區(qū)。當(dāng)被告知輸出不超過 n 個字節(jié)時, snprintf 保證會創(chuàng)建一個長度不超過 n-1 的字符串,字符串最后是一個空結(jié)束符。不過,如果 n 足夠大,它的返回碼是將會完成寫入的字符數(shù)目。這樣,您可以確切地得知您 將 需要多少緩沖區(qū)空間才可以完全格式化某些內(nèi)容。這個函數(shù)隨處可用,而且您應(yīng)該始終使用它;很多安全漏洞都?xì)w咎于 sprintf 中的緩沖區(qū)溢出,而這個函數(shù)可以預(yù)防這個問題。 新標(biāo)準(zhǔn)中很多新的數(shù)學(xué)特性,包括復(fù)雜的數(shù)學(xué)特性和專用的函數(shù),都是設(shè)計(jì)用來幫助優(yōu)化特定浮點(diǎn)芯片的編譯器,但不能保證所有場合都已實(shí)現(xiàn)。如果您需要

50、這些函數(shù),最好先去檢查一下您的目標(biāo)平臺上有沒有這些函數(shù)。浮點(diǎn)環(huán)境函數(shù)并不是總被支持,有一些平臺不會支持 IEEE 運(yùn)算?,F(xiàn)在還不要依賴于這些新特性。C99 中對 strftime() 函數(shù)進(jìn)行了擴(kuò)展,以提供更多常用的格式化字符。這些新字符可能在最新的 Linux 和 BSD 系統(tǒng)上都已經(jīng)可用;但是在較老的系統(tǒng)上,它們還沒有廣泛可用。在使用新格式之前先檢查文檔。 據(jù)說,大部分國際化代碼還沒有被可靠地實(shí)現(xiàn)。其他新的庫特性通常還沒有普遍可用;數(shù)學(xué)函數(shù)在超級計(jì)算機(jī)編譯器中好像已經(jīng)可用了,國際化函數(shù)在美國以外開發(fā)的編譯器中可能可用。編譯器廠商實(shí)現(xiàn)的是被要求實(shí)現(xiàn)的特性。展望一般來說,最好保守地采用新特性。不過,很多 C99 特性現(xiàn)在已

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論