前言
C 語言仍是許多大專院校會使用的工具,許多資訊相關科系的學生多多少少會接觸到 C 語言。但市面上的 C 語言教材多以核心語法為主,除此之外的內容就相對薄弱。本書介紹一些初級教材沒有介紹的內容,可以做為 C 語言的第二本書。
Part I. The Environment
本部介紹 C 語言中有關工具鏈 (toolchain) 的部分,這類工具相關的文件多散見在網站上,一般教科書對此著墨較少,這個部分剛好適時地填補這個空缺。不過,本書作者較著重在類 Unix 系統上的 C 語言工具鏈,對 Windows 系統就不適用。
1. Set Yourself Up for Easy Compilation
本章從 GNU/Linux 等類 Unix 使用者的觀點來介紹如何安裝 C 語言相關工具,像是介紹套件管理軟體 (package management software) 這種在類 Unix 系統上常見但對 Windows 使用者相對陌生的概念。接著介紹類 Unix 系統的系統路徑、C 標準及第三方函式庫、如何使用 GCC 編譯程式、Makefile 的基礎等。
筆者註:由於這本書寫於西元 2014 年,故沒有包括 Windows Subsystem for Linux (WSL) 等新的軟體。不過,WSL 的使用方式和其他類 Unix 系統大同小異,對類 Unix 系統的了解在使用 WSL 時會有相當幫助。
2. Debug, Test, Document
本章介紹除錯 (debugging)、測試 (testing)、撰寫文件 (documentation) 等相互有關的概念。包括使用 GDB 除錯、使用 Valgrind 檢查記憶體洩露 (memory leak)、撰寫測試程式、撰寫說明文件等。在本章中,原作者展示了一些相對少見的小技巧,值得一讀。
3. Packaging Your Project
在本章中,原作者介紹一些打包專案的方式,像是 Makefile 和 Autotools。對小型程式來說,Makefile 比較簡單,若專案規模較大,則用 Autotools 打包較好。大部分知名的開放原始碼專案會使用 Autotools 的形式打包原始碼,便於發佈。
筆者註:這些打包工具較適合類 Unix 系統,在 Windows 系統上可用 CMake。較不建議直接用 Visual Studio 管理專案,除非開發團隊中所有開發者皆使用 Visual Studio 或專案只會在 Windows 系統上發佈。
4. Version Control
本章是 Git 的簡易入門,其實和 C 本身關係不大,只是 Git 是近年來最流行的版本管理軟體,還不會用 Git 的話可以花一點時間學一下。
5. Playing Nice with Others
本章介紹兩個和外部互動的情境,一個是在 C 程式中動態載入外部函式庫,一個是用 C 語言寫 Python 的延伸模組。一開始寫程式時,不會馬上碰到這些情境,如果覺得過難,可以先跳過去無妨。
Part II. The Language
本部介紹 C 語言語法 (syntax) 的部分。由於這本書定位在中階,故本部不會從頭講解基本語法,而會直接就語法上會碰到的一些議題來討論。
6. Your Pal the Pointer
本章幫一些覺得指標 (pointer) 難以駕馭的讀者複習一下指標。一開始談到記憶體管理,接著談到指標和記憶體管理的關係、命令指標變數、指標運算等、利用 typedef
簡化指標變數等。如果覺得指標已經很熟了,略過本章也無妨。
7. Inessential C Syntax that Textbooks Spend a lot of Time Covering
本章講解數個原作者覺得不必要的語法:
- 在
main
函式return 0;
- 在程式最頂端命名所有變數 (註:C89 的限制。)
- 在執行期設置陣列長度
- 減少 cast 的次數
- 少用
enum
- 適當地用
goto
而非完全不用 - 少用
float
,多用double
- 用安全的函式,包括
strtol
或strtod
等,將字串轉為數字
由於這些不建議的用法仍然是合法的 C 程式碼,我們不一定要全盤照抄原作者的意見,但是可以看一看原作者提出的見解,從中汲取有用的部分。
8. Import C Syntax that Textbooks Often Do Not Cover
承上章,本章提出數個有用但被忽略的語法:
- 巨集 (macro)
#pragma once
代替 header guardstatic
和extern
const
的陷阱 (pitfalls)
其中巨集的部分在一般 C 語言入門教材相對少見,可以看一看。
9. Easier Text Handling
C 語言對字串的處理相對於其他高階語言來得低階,本章提出數個和字串處理相關的議題:
- 使用
asprintf
- 使用
strtok
切開字串 - 處理統一碼 (unicode)
筆者註:asprintf
不在 C 標準函式庫中,但在類 Unix 系統上可見。
10. Better Structure
本章使用 C99 後的新特性來設計函式和巨集的介面,這樣的介面不是必備的,但比起原本的 ANSI C 來說,新的介面撰寫方式的確會讓函式更加簡潔。由於本書的作者喜歡寫 C 巨集,在本章和其他部分可以看到一些 C 巨集的範例,這在其他基礎 C 語言教材中相對少見,值得一讀。
11. Object-Oriented Programming in C
雖然 C 不是物件導向語言,但我們可以用物件導向思維再搭配一些手法在 C 語言中寫基於物件的程式。有經驗的讀者應該已經猜到,在 C 語言中會使用結構體 (struct) 模擬 C++ 和 Java 的 this 指標來寫物件。本章以雜湊表、坐標點等範例來展示物件的寫法,也帶到 C11 的泛型巨集敘述 (_Generic
)。
12. Parallel Threads
由於現在的硬體朝向多核心、多處理器等水平擴展的方向來發展,撰寫平行程式變成重要的課題。本文介紹幾個以 C 語言撰寫平行程式的方案:
- OpenMP
- PThreads
- C11 的新方案
13. Libraries
本章介紹一些 C 語言的第三方函式庫,這些函式庫等於是預先造好的輪子,在專案授權許可的前提下,可以節省開發者重覆開發相同功能的時間和心力。包括以下函式庫:
- GLib
- POSIX
- GNU Scientific Library
- SQLite
- libxml
- cURL
由於作者著重在類 Unix 系統下使用 C 語言,有些函式庫對 Windows 系統不適用,需注意。
結語
市面上的 C 語言教材,多以核心語法為主,除此之外,多需依賴網路上零碎的文件。相較起來,本書算是相對少見的中階 C 語言教材。雖然本書的發行日期較久遠,但 C 語言在 C11 後就在語法上沒有大幅度的更新,故仍有一定參考價值。
要注意本書從類 Unix 系統使用者的角度來審視 C 語言,如果需要在 Windows 系統上寫 C 語言程式,有一部分內容就不合用。而且 Visual C++ 對 C 語言標準的支援相對落後,會造成書本和實務的落差。