位元詩人 [書籍回顧] 21st Century C, 2nd Edition 評價

Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

前言

C 語言仍是許多大專院校會使用的工具,許多資訊相關科系的學生多多少少會接觸到 C 語言。但市面上的 C 語言教材多以核心語法為主,除此之外的內容就相對薄弱。本書介紹一些初級教材沒有介紹的內容,可以做為 C 語言的第二本書。

21 Century C, 2nd edition

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
  • 用安全的函式,包括 strtolstrtod 等,將字串轉為數字

由於這些不建議的用法仍然是合法的 C 程式碼,我們不一定要全盤照抄原作者的意見,但是可以看一看原作者提出的見解,從中汲取有用的部分。

8. Import C Syntax that Textbooks Often Do Not Cover

承上章,本章提出數個有用但被忽略的語法:

  • 巨集 (macro)
  • #pragma once 代替 header guard
  • staticextern
  • 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 語言標準的支援相對落後,會造成書本和實務的落差。

關於作者

身為資訊領域碩士,位元詩人 (ByteBard) 認為開發應用程式的目的是為社會帶來價值。如果在這個過程中該軟體能成為永續經營的項目,那就是開發者和使用者雙贏的局面。

位元詩人喜歡用開源技術來解決各式各樣的問題,但必要時對專有技術也不排斥。閒暇之餘,位元詩人將所學寫成文章,放在這個網站上和大家分享。