C語言雖老,但其核心哲學——「信任程式設計師」與「貼近硬體」——至今仍是系統級開發的基石。寫好C程式不在於花俏技巧,而在於紀律與細節。本文整理自經典編程智慧,呈現十大建議與「如何寫爛代碼」的反面教材,助你避坑提效。
編譯器只檢查語法,Lint 類工具能發現潛在邏輯錯誤、類型不匹配、未使用變量等深層問題。將其納入 CI 流程,讓機器做機器擅長的事。
NULL 指針解引用是未定義行為(UB)的重災區。永遠在使用前檢查指針有效性,現代 C 建議使用 static_assert 或斷言輔助防禦。
即使你知道原型匹配,也要顯式轉型(如 (int*)ptr)。隱式轉換在參數提升、變參函數中極易埋下數據截斷或棧錯亂的炸彈。
舊式 C 允許隱式 int 返回,現代標準禁止。頭文件必須完整聲明返回類型,防止調用端默認 int 導致棧平衡崩潰。
C 無邊界檢查,緩衝區溢出是頭號安全漏洞。寫循環時時刻刻驗證索引範圍,sizeof(arr)/sizeof(arr[0]) 應成肌肉記憶。
哪怕代碼膨脹、手指酸痛,也要 if (ret != OK) handle_error();。「這錯誤不可能發生」正是災難降臨的前奏。
qsort、bsearch、strncpy 等經過數十年優化,正確性與效率遠超自寫版本。用好標準庫,代碼更短、更易讀、更穩健。
代碼給人看,順便給機器跑。清晰的結構勝過任何註釋;把智慧用在演算法上,別用在製造迷宮上。
舊式鏈接器只看前 6 字符且不區分大小寫。雖現代工具鏈已放寬,但遵循此規範能保證極致移植性,避免符號衝突的神秘錯誤。
別假設 int 32 位、指針 64 位、小端序、ASCII 字符集。寫可移植代碼,使用 stdint.h 定寬類型,htonl/ntohl 處理網絡序。
malloc 改名 alloc_mem_magic,讓維護者猜謎。printf("Hello"); // 打印 Hello,侮辱智商。C語言給予極大自由,也要求極大自律。十大秘籍是護城河,反面教材是照妖鏡。寫代碼前問自己:「這樣寫,半年後的我能秒懂嗎?異平台能跑嗎?輸入異常會炸嗎?」 以此自省,代碼自然長壽。