[C 語言] 程式設計教學:C 語言標準的演進

【分享本文】
Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email

    C 語言是一個超過 40 歲的程式語言,但並非停滯不前,而經過了數個版本的演進:

    • K&R C
    • ANSI C (或 C89)
    • C99
    • C11
    • C17 (或 C18)

    由於 C 語言是嵌入式系統中常用的工具,另外定義出以下標準:

    • Embedded C

    這套標準加入了一些嵌入式系統適用的特性,一開始學 C 語言時不用急著學這套標準。

    在類 Unix 系統上,還有一個值得注意的標準:

    • POSIX

    雖然 POSIX 嚴格來說不是 C 標準,但類 Unix 系統是除了 Windows 家族外現行作業系統中最普遍的。如果專案不需發布在 Windows 上而要在類 Unix 系統上,可以看一下這套標準提供的 C API。

    了解 C 標準的用意在於了解每個標準可用的語法特性,有助於選擇適合自己的 C 編譯器。如果讀者還沒學 C 語言,對於一些細節尚不了解,可先大略看一下,之後再回頭閱讀。

    K&R C

    這個版本是早期 C 還沒標準化時,所出現的非正式標準,來自於 Brian Kernighan and Dennis Ritchie 於 1978 年所著的 The C Programming Language ,這本書的第二版補足了 ANSI C 的部分。

    包括以下項目:

    • 標準化的 I/O 函式庫
    • long int 型別
    • unsigned int 型別
    • 修改複合指派 (compound assignment) 運算子的撰寫方式

    由於 K&R C 和現行的 C 語法有一些差異,除了知道有這個標準外,不用刻意去學習。

    ANSI C

    註:也稱為 C89。

    第一個 C 語言的國際標準 (ISO standard),大部分 C 語言的學習者和教材所認定的 C 語言就是指這個版本,甚至有些 C 程式設計師仍堅守著這個版本的 C;一個實例就是 Lua 官方直譯器強調他們的 Lua 實作根隨著 ANSI C 的標準,因此有著最佳的可攜性 (portability)。C89 後還有一些較小的更新,像是 C95,但這些後續的更新在 C 語言特性上沒有顯著改變。

    正式的 C 標準文件需付費購買,在網路上散布這些文件是犯法的,因此,一般在網路上查得到的 C 標準文件多為非正式版本 (draft),像是這裡,後續各版本亦同。

    C99

    繼 C89 後第一個重大的版本更新,包括但不限於以下項目:

    • 單行註解 // ...
    • 行內函式 (inline function)
    • 複數 (complex number)
    • 加強對浮點數的支援
    • 布林值 (boolean) 等數個新型別
    • 泛用型別 (type-generic) 函式,這是一些關於數學運算的巨集
    • 可在 for 迴圈開頭宣告變數

    C11

    另一個重大的版本更新,包括但不限於以下項目:

    • 泛用型別函式 (type-generic expression)
    • 多執行緒支援
    • 改善對萬國碼 (unicode) 的支援
    • 匿名結構

    現代 C 語言就是指 C11 之後的 C 語言。由於 C11 已經問世多年,大部分主流 C 編譯器都已經實作了這個標準,除了有維護舊專案的考量外,應可放心地在專案中使用這個標準。

    C17

    C17 則是對 C11 的一些改善,主要的目標為修復 C11 的一些 bug,沒有引入新的語法特性。

    註:不要將 C17 和 C++17 搞混,前者是 C 標準,後者則是 C++ 標準。

    POSIX

    POSIX (Portable Operating System Interface) 本身不是 C 語言標準,而是類 Unix 系統的標準,該標準規範有關殻程式 (shell)、命令列工具、一些 C 函式庫等項目。對於 C 語言來說,POSIX 標準提供了一些除了 C 標準函式庫以外的 API。Windows 家族系統沒有遵守 POSIX 標準,但目前市面上知名的系統,包括 Mac OS、GNU/Linux、BSD 系統等,大抵上都是 POSIX 相容的,所以 POSIX 仍然值得注意。

    各個 C 編譯器對 C 標準的支援

    常見的 C 編譯器中,GCCClang 對 C 標準支援較好,支援 C89、C99 和一部分的 C11,而 Visual C++ 僅支援 C89 和一部分的 C99。這些訊息可能會隨時間改變,最好的方式是自行查閱各編譯器的官方手冊。

    本系列文的方向

    我們會合理地使用新的語言特性,但會附註這些特性是在那個時期的 C 標準中。我們的目標編譯器會以 GCC 為優先考量,因 GCC 在類 Unix 系統上相當容易取得,甚至在 Windows 家族系統上也可以透過 MinGW 取得 GCC 的移植品;而 Visual C++ 對 C 語言的支援相對落後,沒有必要死守在舊有的標準中。

    現代語言在發展時,大抵上也一併發展相關的工具;但 C 語言的開發工具會因系統而異,因此,我們會分 Windows、Mac、GNU/Linux 等系統來討論 C 相關的工具。

    【分享本文】
    Facebook Twitter LinkedIn LINE Skype EverNote GMail Yahoo Email
    【追蹤新文章】
    Facebook Twitter Plurk
    標籤: C 語言