C 語言常見誤解

維基教科書,自由的教學讀本

前言[編輯]

許多寫 C 的人了解很多實作(編譯器、機器和作業系統)的細節,誤把特定實作當成 C 語言標準的一部分,寫出許多不可攜(non-portable)的程式碼而不自知。可攜程式碼不會因為開最佳化選項而產生錯誤,也能一字不動的從 32 位元系統移植至 64 位元系統上(或是稍早之前,從 16 位元系統移植至 32 位元系統),跨越所有符合標準的實作。不一定要換電腦或改用嵌入式系統才算換實作;只要換編譯器或是改變參數,都算一個新的實作。

這本書企圖列出寫 C 語言一段時間後還是很難知道的陷阱。除了標準文件的考證外,也盡量舉出實際上會發生錯誤的實作(機器型號、編譯器用的參數等等),以免淪為理論空談。改編成 Wikibook 格式前,問題清單主要從台灣 BBS 站 PTT 的 C/C++ 版實地考察蒐集而成。除標準委員會公佈的文件外,主要考證依據還包括 comp.std.c 討論區。本書並不反對程式設計師查閱實作的文件,相反的鼓勵大家查閱各種標準;本書反對的是誤把特定實作細節當作 C 語言標準。

這本書並不是給初學者讀的,而是針對有經驗的 C 程式設計師而寫,因此不會有初學才有的問題。有興趣的人可下載 C 標準 官方草稿 N1256 搭配問答一起看,其中 2.3p4 代表 2.3 第 4 段;本書語言標準的超連結全連往非官方 N1256 網頁版本

改編成 Wikibook 格式前,本篇文章收錄誤解問答的準則與精神如下:

  • 可攜性為最高原則。「誤解」代表寫出不可攜的程式碼而不自知。特定平台上不可攜的程式碼可能有明確的定義,但不在討論範圍內。
  • 本文認為「以為某語法正確」比「以為某語法錯誤」嚴重,因此
    • 不提保證可攜的炫技寫法。
    • 介紹安全寫法時,以實務上好記好理解為原則。當規則過於複雜時,寧可介紹更保守但保證安全的簡單作法。
  • 只收錄長年寫 C 的人可能有的誤解,不收錄初學 C 時才容易犯的錯誤。
  • 不收錄 C++ 為主的問答(因為文章已經太長了),不過可以適時提 C++ 的狀況。
  • 優先收錄編譯器不用發出任何警告,而且有真實例子的誤解。

現在改編成 Wikibook 格式,希望能藉由大家參與,讓原文章變得更有用。有發現什麼錯誤或遺漏的地方嗎?請動手改吧!