【在主画面加入捷径】
       
【选择语系】
繁中 简中

[书籍回顾] 21st Century C, 2nd Edition 评价

REVIEW

    前言

    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
    • 用安全的函式,包括 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 语言标准的支援相对落后,会造成书本和实务的落差。

    如何购买

    透过以下链接即可购买本书。

    TAGS: C 语言