有哪些較好的 C 語言程序源碼可供新手臨摹參考?

麻煩了,自己翻的話實在是看不太明白


來《從零開始的 JSON 庫教程》吧,對象是剛學會 C 語言的同學,逐單元講解開發過程,附帶各種小知識,每個單元還有練習啊,最終成果會是一個幾百行的符合標準 JSON 庫。


sqlite,只有幾萬行,可以在本機方便調試,裡面優秀演算法和數據結構很多。


我不同意排名第一的答案,那個答案中確實列舉了很多短小經典的C語言項目,但是相對於提問者的問題,這些項目對於一個剛剛學了C語言的新手來提供其實並不是最好的選擇。

為什麼不是最好的選擇?

因為很多項目背後都隱藏著業務邏輯,而不是僅僅是語言本身,想要讀懂那個項目的前提是比較了解業務邏輯。才知道為什麼要這麼做。例如http Server,如果對於一個連socket和http協議都不懂的初學者,你讓他去看HttpServer他如何理解?

所以單就C語言的新手,在了解基本語法之後,下一步應該做的是去讀讀c標準庫或者glibc中各個函數都是怎麼實現的,為什麼這麼實現,每一個函數都是有明確目的,同時沒有業務邏輯背景要求。但是這些函數又是把c語言本身的語言特性用到極致。

學完語言直接讀工程代碼,相當於是學完了英語的基本語法,就是開始看經典小說。沒有辭彙和片語搭配做基礎,讀起來非常費勁。 而讀標準庫就好像是在學習辭彙和片語搭配。有了這個基礎再去看小說,就事半功倍。同時熟悉掌握標準庫或者glibc之後,對於寫程序,就好像手中多了很多工具,相對減少了自己造輪子的機會。當然c語言的天生缺陷就是標準庫的功能太弱。所以造輪子和找輪子是用c生生不息的活動。不過標準庫對新手自我提高還是綽綽有餘了。

最後推薦這本書:C標準庫 (豆瓣)


題主好,我也很想深入學習 C,與你有同樣的困惑,最近學了一招,

直接在 GitHub 上搜,語法為:

stars:&>20 extension:c language:c

很多出名的項目就浮出水面了,可以挑選自己喜歡的鑽研。


如果會Linux的話,建議看看busybox中一些小工具的實現,全是unix里的經典c語言程序,而且不長,


其實讀musl挺不錯的,一個現代的libc庫。

完全為現代設備優化,有詳盡的單元測試,讓你知道一個現代的c項目該怎麼寫怎麼測。主要是它許多函數都是獨立的,讀起來不那麼費勁。你可以在讀每個標準庫函數實現之前或者之後自己實現一個並做對比,反正有單元測試可以幫助檢查是否寫錯了。不過裡面有一些設計是為了榨乾硬體的性能,初學者未必要完全掌握吧。


轉自網上不知道什麼地方

代碼閱讀——十個C開源項目

1. Webbench

Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的性能,最多可以模擬3萬個並發連接去測試網站的負載能力。Webbench使用C語言編寫, 代碼實在太簡潔,源碼加起來不到600行。下載鏈接:Web Bench Homepage

2. Tinyhttpd

tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質。下載鏈接:Tiny HTTPd | SourceForge.net

2. CMockery

cmockery是google發布的用於C單元測試的一個輕量級的框架。它很小巧,對其他開源包沒有依賴,對被測試代碼侵入性小。cmockery的源代碼行數不到3K,你閱讀一下will_return和mock的源代碼就一目了然了。

主要特點:

  1. 免費且開源,google提供技術支持;

  2. 輕量級的框架,使測試更加快速簡單;

  3. 避免使用複雜的編譯器特性,對老版本的編譯器來講,兼容性好;

  4. 並不強制要求待測代碼必須依賴C99標準,這一特性對許多嵌入式系統的開發很有用

下載鏈接:Downloads -
cmockery -

A lightweight library to simplify and generalize the process of writing unit tests for C applications.

3. cJSON

cJSON是C語言中的一個JSON編解碼器,非常輕量級,C文件只有500多行,速度也非常理想。

cJSON也存在幾個弱點,雖然功能不是非常強大,但cJSON的小身板和速度是最值得讚賞的。其代碼被非常好地維護著,結構也簡單易懂,可以作為一個非常好的C語言項目進行學習。項目主頁:cJSON | SourceForge.net

3. Libev

libev是一個開源的事件驅動庫,基於epoll,kqueue等OS提供的基礎設施。其以高效出名,它可以將IO事件,定時器,和信號統一起來,統一放在事件處理這一套框架下處理。基於Reactor模式,效率較高,並且代碼精簡(4.15版本8000多行),是學習事件驅動編程的很好的資源。下載鏈接:http://software.schmorp.de/pkg/libev.html

4. Memcached

Memcached 是一個高性能的分散式內存對象緩存系統,用於動態Web應用以減輕資料庫負載。它通過在內存中緩存數據和對象來減少讀取資料庫的次數,從而提供動態資料庫驅動網站的速度。Memcached 基於一個存儲鍵/值對的 hashmap。Memcached-1.4.7的代碼量還是可以接受的,只有10K行左右。下載地址:memcached - a distributed memory object caching system

5. Lua

Lua很棒,Lua是巴西人發明的,這些都令我不爽,但是還不至於臉紅,最多眼紅。

讓我臉紅的是Lua的源代碼,百分之一百的ANSI C,一點都不摻雜。在任何支持ANSI C編譯器的平台上都可以輕鬆編譯通過。我試過,真是一點廢話都沒有。Lua的代碼數量足夠小,5.1.4僅僅1.5W行,去掉空白行和注釋估計能到1W行。下載地址:The Programming Language Lua

6. SQLite

SQLite是一個開源的嵌入式關係資料庫,實現自包容、零配置、支持事務的SQL資料庫引擎。 其特點是高度便攜、使用方便、結構緊湊、高效、可靠。足夠小,大致3萬行C代碼,250K。 下載地址:SQLite Home Page 。

7. Redis

Redis是一個用ANSI C 編寫的開源數據結構伺服器。Redis的代碼非常容易讀懂,代碼寫的很整潔,並且代碼量相對較小(4.5w行,其實也不是很小)。大部分都是單線程的,幾乎不依賴其它庫。下載地址:redis.io/

8. Nginx

Nginx("engine x") 是一個高性能的 HTTP 和反向代理伺服器,也是一個 IMAP/POP3/SMTP 代理伺服器 。Nginx 是由 Igor Sysoev 為俄羅斯訪問量第二的http://Rambler.ru站點開發的,它已經在該站點運行超過四年多了。Igor 將源代碼以類BSD許可證的形式發布。自Nginx 發布四年來,Nginx 已經因為它的穩定性、豐富的功能集、 示例配置文件和低系統資源的消耗而聞名了。

nginx的優秀除了體現在程序結構以及代碼風格上,nginx的源碼組織也同樣簡潔明了,目錄結構層次結構清晰,值得我們去學習。下載地址:nginx: download。

9. UNIXv6

UNIX V6 的內核源代碼包括設備驅動程序在內 約有1 萬行,這個數量的源代碼,初學者是能夠充分理解的。有一種說法是一個人所能理解的代碼量上限為1 萬行,UNIX V6的內核源代碼從數量上看正好在這個範圍之內。看到這裡,大家是不是也有「如果只有1萬行的話沒準兒我也能學會」的想法呢?

另一方面,最近的操作系統,例如Linux 最新版的內核源代碼據說超過了1000 萬行。就算不是初學者,想完全理解全部代碼基本上也是不可能的。下載地址:http://minnie.tuhs.org/cgi-bin/utree.pl?file=V6

10. NETBSD

NetBSD是一個免費的,具有高度移植性的 UNIX-like 操作系統,是現行可移植平台最多的操作系統,可以在許多平台上執行,從 64bit alpha 伺服器到手持設備和嵌入式設備。NetBSD計劃的口號是:"Of course it runs NetBSD"。它設計簡潔,代碼規範,擁有眾多先進特性,使得它在業界和學術界廣受好評。由於簡潔的設計和先進的特徵,使得它在生產和研究方面,都有卓越的表現,而且它也有受使用者支持的完整的源代碼。許多程序都可以很容易地通過NetBSD Packages Collection獲得。下載地址:The NetBSD Project


說句實在話,gcc裡面有個algorithm.h,自帶的,內容精巧細緻全面…可以考慮看一下。


J語言解釋器,裡面一定要長這樣 jsource/am.c at master · jsoftware/jsource · GitHub (逃


C Interfaces and Implementations(C語言介面與實現:創建可重用軟體的技術)

這本書中的代碼風格工工整整,非常值得模仿。

我不主張一上來就讀哪個開源項目的源碼,因為那些開源代碼就像連筆字和草書,根本不適合「臨摹」。


不知道各位兄台咋想的, 一上來就推薦nginx、lua、redis這些項目, 且不談這些語言為了實現跨平台的大量代碼, 並且這些項目都需要背景知識, 要是樓主對編譯原理一點概念都沒, 那麼lua看起來就是天書, 要是樓主不熟悉linux系統編程和HTTP, nginx看來看去也不知道是在幹嘛的。

花時間研究這麼晦澀的代碼還不如老老實實看那幾本基礎書籍, 到需要看這些源碼的時候再去看, 就會或然開朗。


開源c項目的話推薦 lua 小巧精緻(而且也浪漫 :P

不過我覺得對新手來說,純看代碼會比較困難

可能更適合推薦一些書給你:

這本書大學時看到,感覺對我幫助挺大的:

代碼閱讀方法與實踐 (豆瓣)

另外這本書我感覺對新手學C語言也很好,有點老了,不過很經典:

操作系統:設計與實現(第二版) (豆瓣)

這幾本我也很喜歡,感覺很適合用來進一步提高C語言編程能力

C專家編程 (豆瓣)

C和指針 (豆瓣)

C陷阱與缺陷 (豆瓣)


必然是cJSON咯,對於新手來說看完簡直受益良多。

不過它的內部邏輯,要自己寫過才知道。


The C(at) Programming Language


這裡推薦一下兩個答主看過部分源碼的項目,如果光有源碼,沒有文檔的話,其實對於代碼閱讀者來說,看起來會比較吃力:

  • CPython:這裡推薦一本書,陳儒先生的Python源碼刨析(Python源碼剖析 (豆瓣)),國人很少有的優秀的技術書籍。這本書不僅僅會讓你更了解Python,你也可以在閱讀的過程中hack一個小python。
  • Redis:同樣,這裡推薦黃建宏同學寫的一本書:Redis 設計與實現,參考源代碼閱讀效果會很好。在一年前,這本書還沒有出版,是一個在線閱讀的開源項目。這本書的資料列表中還有redis的注釋代碼。Redis的代碼非常漂亮整潔,是我讀過的最易懂的代碼之一。

不要操之過急,多動手實踐,自己去編譯,耐心一點會有收穫。


如果是單片機方向,建議去看STM32的函數庫(其他單片機的函數庫也行),如果其他方向就不知道了


作為C新手,個人覺得結合數據結構,把經常使用的數據結構自己過一遍,然後再往項目方向轉換。GitHub - srdja/Collections-C: A library of generic data structures. 參考這個庫自己代碼走一遍,有個C基礎。然後我個人推薦一個libnet,網路數據包和raw socket編程。

(1)了解網路中基本的一些協議;

(2)只是一個庫,不是一個項目,需要從頭到尾讀代碼;

(3)其中代碼之間沒有什麼聯繫,看懂一個tcp數據包的構造,可以通過了解icmp協議,自己模仿編寫。


我特別地,熱情地推薦cJSON項目

https://github.com/DaveGamble/cJSON

如你所見,作者在README里早已說明這個項目務求要成為最直白(dumbest)的JSON parser。雖然它在@Milo Yip 的評測里不算特別優秀,但勝在短小精悍,一個c文件一個h文件,沒有任何黑科技,注釋也比較詳細,只是(個人感覺)代碼風格有點粗魯,但無傷大雅,可用常見的beautifier 來整理一下方便閱讀,加上JSON本來就很簡單,作為入門級的C項目完全夠格。


去OSDev 上看著wiki 慢慢來,慢慢做,不推薦一上來就看開源項目,自己先硬著頭皮寫點代碼,是最好的,知識不夠可以回爐重造。學習是螺旋式的前行,在不確定中前行,取捨,迂迴,是最爽的。一來看代碼再寫,效果就不明顯了。


推薦你兩個C語言寫的程序吧,代碼清晰,注釋詳細,還有程序的設計思路和數據結構描述:

C語言---連續計算器項目

C語言---俄羅斯方塊遊戲

《C語言核心30天突破》


推薦閱讀:

新手入門c語言應該下載那個軟體?
寫庫函數供他人用的原理是什麼?
C語言編譯中,如何查看定義了哪些宏?
如果要寫一個類似於現在Word的軟體,僅用C語言或者C++,可以完成嗎?
清華大學譚浩強的C語言書籍怎麼樣?

TAG:編程語言 | 編程 | C編程語言 | 編程學習 |