這本新版的經典O’Reilly參考書,對于C語言及其運行庫中的每個特性給予了清晰、詳細的解釋,包括多線程、泛型宏,以及其他2011年C語言標準(C11)中的新功能。如果您想理解一個陌生函數的作用,以及標準鏈接庫是如何規范它的執行,您可以在本書中找到答案。對于有經驗的C與C++程序員,這本書也相當適用,它包含了GNU軟件工具集中常用工具的使用說明。您將會學到如何使用GNUmake創建C程序,從C源代碼編譯獲得執行程序,以及使用GNU調試器對程序進行測試與調試。
本書是一本關于C編程語言與C語言鏈接庫的完整參考手冊。作為一本闡述核心技術(InaNutshell)的書,它的目的是在日常工作中為C語言程序員提供方便、可靠的輔助作用。本書介紹了C語言的所有元素,并通過大量的示例展示了這些元素的用法。
最新的C語言規范是2011年發布的C語言國際標準,ISO/IEC9899:2011,通常稱為C11。該標準取代了C99標準(ISO/IEC9899:1999)及其技術修正,這些修正包括2001年的TC1、2004年的TC2,以及2007年的TC3。第一個C語言國際標準于1990年發布,名為ISO/IEC9899:1990,它于1995年增補了規范性附錄1(ISO/IEC9899/AMD1:1995)。1990年的ISO/IEC標準對應于ANSI標準X3.159,后者于1989年發布,通常稱為ANSIC或C89。
并非所有編譯器以及標準庫實現版本都支持2011年所發布C語言標準的新特性。因此,在本書中,我們會在2011年C語言標準的新特性上標注C11(例如多線程、泛型宏,以及新的標準庫函數)。在C99標準所引入的擴展特性上標注C99。
本書不是針對C語言編程的入門書籍。雖然它涵蓋了該語言的所有基礎,但這些內容并非以教程的形式組織編寫。如果你尚未接觸過C語言,我們建議你先學習至少一本C語言入門書籍。如果你有其他編程語言的經驗,例如Java或C++,也可以直接參考本書。
本書的組織方式本書分為三部分。第一部分嚴格按照各項介紹C語言;第二部分介紹標準庫;第三部分通過GNU軟件集合中廣泛使用的工具,介紹程序的編譯與測試過程。
第一部分第一部分包括第1~15章,介紹C語言的基礎知識。第1章介紹了C語言的常見概念與元素,在后續幾章每章都有一個具體的主題,例如類型、語句、指針等。這些章節主題次序的排列原則是:后一個主題涵蓋的內容在之前的主題中已經介紹過(例如,先介紹類型,然后是表達式和運算符,接著是語句,等等),但有時候在閱讀當前章節時仍然需要參考后續章節,以了解一些相關的細節。例如,雖然指針與數組的詳細介紹在第8章與第9章,但是在第5章中提前討論指針與數組是十分有必要的(第5章介紹表達式和運算符)。
第1章,C語言基礎介紹C語言的特性,以及如何編寫和編譯C程序。本章引入了一些基本概念,例如翻譯單元、字符集與標識符。
第2章,數據類型首先綜述C語言中的類型,然后介紹了基本類型、void類型與枚舉類型。
第3章,字面量介紹數字常量、字符常量、字符串字面量,包括轉義符。
第4章,類型轉換介紹顯式與隱式的類型轉換,包括整數提升與尋常算術轉換。
第5章,表達式和運算符介紹表達式的計算、所有運算符,以及與運算符對應的操作數。
第6章,語句介紹C語言的語句,例如語句塊、循環,以及跳轉。
.第7章,函數介紹函數的定義與函數的調用,包括遞歸函數與內聯函數。
第8章,數組介紹固定長度數組與長度可變數組,包含字符串、數組初始化,以及多維數組等。
第9章,指針介紹對象指針與函數指針的定義及使用方法。
第10章,結構、聯合與位字段介紹在用戶自定義類型中數據的組織方式。
第11章,聲明介紹聲明的一般語法、標識符鏈接,以及對象的存儲周期。
第12章,動態內存管理介紹標準庫的動態內存管理函數,然后通過實現一個二叉樹來展示這些函數的使用方法。
第13章,輸入和輸出介紹C語言中輸入與輸出的概念,然后綜述標準I/O鏈接庫的使用方法。
第14章,多線程介紹C11中多線程特性的使用方法,包括原子操作、線程間交流,以及線程存儲。
第15章,預處理命令介紹宏的定義與使用方法、條件式編譯,以及其他所有預處理命令與操作。
第二部分第二部分包括第16~18章,內容是C語言標準庫。這部分綜述了標準頭文件,并包括了詳細的函數使用參考。
第16章,標準頭介紹標準頭文件的內容及用途。頭文件包含了所有的標準庫宏以及類型定義。
第17章,函數簡介通過函數的應用領域,綜述標準庫函數(例如,數學函數、時間與日期函數等)。
第18章,標準庫函數按照函數名的字母次序,詳細介紹每個標準庫函數,并使用示例展示每個函數的使用方法。
第三部分第三部分包括第19~22章,介紹關于C語言編程工具的基礎知識,包括:編譯器、make工具集,以及調試器。這里所介紹的工具都屬于GNU軟件包。最后,以EclipseIDE為例,介紹在C語言集成開發環境(IDE)中如何使用上述工具。
第19章,使用GCC編譯C程序介紹GCC編譯器針對C語言程序員所提供的核心功能,GCC編譯器是現今廣泛使用的C語言編程工具。
第20章,使用make構建C程序介紹如何使用make程序自動編譯大型程序。
第21章,使用GDB調試C程序介紹如何使用GNU調試器執行程序,以及如何分析程序的執行行為以找到邏輯錯誤。
第22章,使用IDE介紹集成開發環境(IDE)的使用方法,IDE使得在C程序開發中可以統一、便利地訪問所有工具。
推薦閱讀本書中許多地方都介紹了進一步提升編程能力建議閱讀的參考資料,如果讀者還需要更多的技術細節,可參閱一些資源站點,例如C語言標準化國際工作組織的官方主頁(http://www.open-std.org/jtc1/sc22/wg14),其中提供了C語言標準最新版本的鏈接,以及該組織當前正在開展的項目。
如果讀者的興趣不僅限于了解C語言是什么、怎樣使用,還想知道C語言背后的原理,WG14網站提供了一些關于C語言原理介紹的鏈接。這些文件介紹了在C語言標準化過程中的一些動機與限制。另外,如果想知道C語言最初是如何創建的,可以閱讀C語言之父DennisRitchie的文章“TheDevelopmentoftheCLanguage”(https://www.bell-labs.com/usr/dmr/www/chist.html)。你也可以在他的貝爾實驗室網站(https://www.bell-labs.com/usr/dmr/www/index.html)上找到該文章以及其他歷史文章。
如果想了解C語言范疇以外的浮點數學的細節信息,可以閱讀DavidGoldberg關于此方面的文獻“WhatEveryComputerScientistShouldKnowAboutFloating-PointArithmetic”,下載網址是:http://docs.sun.com/source/806-3568/ncg_goldberg.html。
本書約定本書使用下列排版約定:
斜體標示新的術語;指示文件名、文件擴展、URL、目錄以及Unix工具。
等寬字體(constantwidth)表示C源代碼的所有元素:關鍵字、運算符、變量、函數、宏、類型、參數與字面量。也用于表示控制臺命令與選項,以及這類命令的輸出。
等寬粗體(constantwidthbold)強調在代碼示例中討論的函數或語句。在編譯器make及調試器部分,該字體表示用戶鍵入的輸入命令。
等寬斜體(constantwidthitalic)指示函數原型或占位符的參數,以替代你的值。
純文本(plaintext)表示按鍵,例如回車鍵、Tab鍵,以及Ctrl鍵。
表示提示或建議。
表示普通注解。
表示警告或注意。
使用代碼示例補充材料(例如書中列舉的代碼示例、練習等)可從如下網址下載:https://github.com/hzbooks/c-in-a-nutshell-2E。
本書的目的是幫助你完成工作。一般情況下,你可以使用本書所提供的樣例代碼進行編程和文檔撰寫。不需要聯系我們獲得許可,除非重現代碼的重要部分。例如,使用書中的一些代碼段進行編寫程序,無需獲得許可。銷售或發行來自O扲eilly圖書的光盤實例,需要獲得許可。引用本書和引用代碼實例來解決問題,無需獲得許可。從本書獲取大量的樣例代碼到你的產品文檔,需要獲得許可。
我們感激你的署名,但不會強求。署名通常包含書名、作者、出版商和ISBN。例如:“CinaNutshell,2ndEditionbyPeterPrinzandTonyCrawford(O扲eilly).Copyright2016PeterPrinz,TonyCrawford,978-1-491-90475-6。”
如果你覺得你使用的代碼示例超出正當使用或上面給出的權限,請隨時與我們聯系:permissions@oreilly.com。
SafariBooksOnlineSafariBooksOnline是一個點播式數字圖書館,它提供了來自全球在技術與商業方面著名作者所提供的專業知識內容,并以圖書與視頻形式進行傳遞。
技術專家、軟件開發者、網站設計者,以及商業與創新專家,正在使用SafariBooksOnline作為他們的首選資源,以開展研究、解決問題、學習與認證培訓。
SafariBooksOnline為企業、政府、學校以及個人提供了一系列的計劃,并給出了對應的價格。
作為會員,您可以從該項目的數據庫中訪問數千圖書、培訓視頻,以及出版前手稿。全球有數百家出版商作為SafariBooksOnline的內容提供商,其中包括O扲eillyMedia,PrenticeHallProfessional,Addison-WesleyProfessional,MicrosoftPress,Sams,Que,PeachpitPress,FocalPress,CiscoPress,JohnWiley&Sons,Syngress,MorganKaufmann,IBMRedbooks,Packt,AdobePress,FTPress,Apress,Manning,NewRiders,McGraw-Hill,Jones&Bartlett,CourseTechnology。關于SafariBooksOnline的更多信息,請訪問其網站(www.safaribooksonline.com)。
如何聯系我們如果你對本書有意見和問題,請聯系出版商。
美國:
O'ReillyMedia,Inc.1005GravensteinHighwayNorthSebastopol,CA95472中國:
北京市西城區西直門南大街2號成銘大廈C座807室(100035)奧萊利技術咨詢(北京)有限公司我們為本書提供了網頁,該網頁上面列出了勘誤表、范例和任何其他附加的信息。您可以訪問如下網頁獲得:
http://bit.ly/C_Nutshell_2e要詢問技術問題或對本書提出建議,請發送電子郵件至:
bookquestions@oreilly.com要獲得更多關于我們的書籍、課程會議和新聞的信息,請參見我們的網站:
http://www.oreilly.com.cnhttp://www.oreilly.com致謝感謝O'Reilly的每一位成員對本書所做的出色工作,尤其是我們的編輯RachelRoumeliotis與KatieSchooling,他們全程指導了本書的出版。感謝我們的技術審校MattCrawford、DavidKitabjian、ChrisLaPre、JohnC.Craig,以及Lo?cPefferkorn,他們對手稿提出了許多寶貴的意見。還要感謝我們的產品編輯KristenBrown,文字編輯GillianMcGarvey,他們全身心地對本書排版設計,使得本書精美而富有現代氣息。最后,感謝JonathanGennick,他這些年一直不遺余力地推動著整個項目的實施。
Peter首先,感謝Tony在本書寫作過程中的出色合作。感謝我所有的朋友,我在創作本書時沒有時間與他們相聚,他們一次次給予了理解與支持。最后,我要將本書獻給我的女兒Vivian與Jeanette(如今她們都獲得了計算機科學的博士學位),是她們堅定了我完成本書的信念。
Tony感謝Peter,讓我在本書寫作過程中能夠充分貢獻出我的力量。
前言 1
第一部分 語言
第1章 C語言基礎 11
1.1 C語言特性 11
1.2 C語言程序的結構 12
1.3 源代碼文件 14
1.4 注釋 15
1.5 字符集 16
1.6 標識符 22
1.7 C編譯器運行原理 26
第2章 數據類型 29
2.1 數據類型分類 29
2.2 整數類型 30
2.3 浮點類型 36
2.4 復數浮點類型 38
2.5 枚舉類型 39
2.6 void類型 40
2.7 對象在內存中的對齊方式 41
第3章 字面量 43
3.1 整數常量 43
3.2 浮點常量 44
3.3 字符常量 46
3.4 字符串字面量 49
第4章 類型轉換 53
4.1 算術類型的轉換 54
4.2 非算術類型的轉換 61
第5章 表達式和運算符 69
5.1 如何計算表達式 70
5.2 運算符細節 75
5.3 常量表達式 98
第6章 語句 100
6.1 表達式語句 100
6.2 語句塊 101
6.3 循環 102
6.4 選擇語句 106
6.5 無條件跳轉 110
第7章 函數 114
7.1 函數定義 114
7.2 函數聲明 121
7.3 函數如何被執行 122
7.4 指針作為參數和返回值 122
7.5 內聯函數 124
7.6 無返回函數 125
7.7 遞歸函數 126
7.8 可變參數函數 127
第8章 數組 129
8.1 定義數組 129
8.2 獲取數組元素 131
8.3 初始化數組 132
8.4 字符串 134
8.5 多維數組 136
8.6 數組作為函數參數 138
第9章 指針 140
9.1 聲明指針 140
9.2 指針運算 143
9.3 指針和類型限定符 147
9.4 數組的指針和指針的數組 151
9.5 指向函數的指針 155
第10章 結構、聯合與位字段 157
10.1 結構 157
10.2 聯合 167
10.3 匿名結構與聯合 169
10.4 位字段 170
第11章 聲明 173
11.1 對象與函數聲明 174
11.2 類型名稱 181
11.3 typedef 聲明 182
11.4 _Static_assert 聲明 184
11.5 標識符的鏈接 185
11.6 對象的存儲周期 186
11.7 初始化 187
第12章 動態內存管理 190
12.1 動態內存分配 190
12.2 已分配內存的特性 192
12.3 調整內存大小和釋放內存 193
12.4 通用二叉樹 194
12.5 特性 195
12.6 二叉樹的實現 195
第13章 輸入和輸出 205
13.1 流 205
13.2 文件 207
13.3 打開和關閉文件 209
13.4 讀操作和寫操作 211
13.5 文件隨機訪問 230
第14章 多線程 233
14.1 線程 233
14.2 訪問共享數據 238
14.3 線程間的通信:條件變量 245
14.4 線程對象和線程存儲 249
第15章 預處理命令 253
15.1 插入頭文件的內容 254
15.2 定義和使用宏 256
15.3 泛型宏 263
15.4 條件式編譯 264
15.5 定義行號 266
15.6 生成錯誤消息 266
15.7 #pragma命令 267
15.8 _Pragma運算符 267
15.9 預定義的宏 268
第二部分 標準庫
第16章 標準頭 273
16.1 使用標準頭 273
16.2 邊界檢查函數 277
16.3 標準頭的內容 278
第17章 函數簡介 308
17.1 輸入和輸出 308
17.2 數學函數 309
17.3 字符分類和轉換 316
17.4 字符串處理 318
17.5 多字節字符 319
17.6 在數字與字符串之間轉換 321
17.7 搜索和排序 322
17.8 內存區域處理 322
17.9 動態內存管理 323
17.10 日期和時間 323
17.11 進程控制 324
17.12 國際化 325
17.13 非本地跳轉 326
17.14 多線程(C11) 327
17.15 調試 331
17.16 錯誤消息 331
第18章 標準庫函數 333
第三部分 基本工具
第19章 使用GCC編譯C程序 673
19.1 GNU編譯器套件 673
19.2 獲取和安裝GCC 674
19.3 使用GCC編譯C程序 675
19.4 C方言 685
19.5 編譯器警告 686
19.6 優化 688
19.7 調試 692
19.8 剖析 692
19.9 選項和環境變量匯總 692
第20章 使用make構建C程序 698
20.1 目標、依賴和命令 698
20.2 Makefile 699
20.3 規則 699
20.4 注釋 706
20.5 變量 707
20.6 偽目標 714
20.7 其他目標屬性 716
20.8 宏 717
20.9 函數 718
20.10 命令 722
20.11 執行make命令 725
第21章 使用GDB調試C程序 733
21.1 安裝GDB 733
21.2 調試過程示例 734
21.3 啟動GDB 738
21.4 使用GDB命令 743
21.5 在GDB內分析核心文件 765
第22章 使用IDE 767
22.1 針對C語言的IDE 767
22.2 針對C/C++的Eclipse IDE 768
22.3 使用Eclipse開發一個C程序 770
22.4 使用Eclipse調試一個C程序 773
22.5 關于Eclipse的更多信息 775