來自OO背景(C#/ java)我正在尋找資源來學習如何很好地設計純C程序。學習C程序設計資源
雖然我熟悉C的語法,並且我可以編寫小程序,但我不確定採用哪種方法來處理大型應用程序,以及採用何種技術。任何你可以推薦的東西。編輯:我很高興完全放棄面向對象編程目的在C中,我的興趣在於學習如何構造一個沒有面向對象的程序,我想了解如何在過程語言中設計程序的好方法,如C.
來自OO背景(C#/ java)我正在尋找資源來學習如何很好地設計純C程序。學習C程序設計資源
雖然我熟悉C的語法,並且我可以編寫小程序,但我不確定採用哪種方法來處理大型應用程序,以及採用何種技術。任何你可以推薦的東西。編輯:我很高興完全放棄面向對象編程目的在C中,我的興趣在於學習如何構造一個沒有面向對象的程序,我想了解如何在過程語言中設計程序的好方法,如C.
This posting擁有的UNIX書籍列表,其中包括最經典的C/Unix的作品。對於Windows上的C編程,Petzold的Programming Windows可能是最好的開始。
對於C程序設計,一些unix編程書籍會告訴你片段,但我不知道「C程序結構」一書。
如果你使用到Java,一些技巧對C編程有:
Makeuseofstack。通常當你調用一個過程時,你會希望在調用者的棧幀中分配變量,並將指針傳遞給你想調用的過程。這將比使用malloc()
動態分配內存的速度快得多,而且容易出錯。在適當的地方做到這一點。
C沒有做garbage collection,所以動態地分配數據項是更繁瑣,你必須跟蹤它們在棧上分配make sure they get freed.變量(參見圖1)是更多的「地道」,他們都是適用的。另外,你不必釋放它們 - 這是局部變量的獎勵。 (2)的適用,考慮一種體系結構,其中你的函數返回一個狀態或錯誤代碼並根據(1)使用棧傳入和傳出數據。
瞭解什麼preprocessor做什麼,如果你能,你不應該用它做均勻。
瞭解endian-ness,word alignment,pointer arithmetic和其他低級建築奧祕的來龍去脈。與流行觀點相反,這些不是火箭科學。如果您感覺敏銳,請嘗試使用匯編語言,並掌握相關知識。它會爲你理解C程序中發生的事情做很多事情。
C沒有模塊範圍的概念,因此計劃使用include,原型聲明以及使用extern
和static
來創建私有範圍和導入標識符。
GUI編程是allplatforms.
的中肯乏味(10)學習的至少一個腳本語言的C API諸如Tcl,Lua或Python.在許多情況下C的最佳使用是作爲一個核心的高性能引擎,基本上是用別的東西編寫的應用程序。
構造相對應的是,你的光標到需要設定的項目傳遞一個正在初始化函數。通常你可以通過調用看起來像setup_foo(&my_foo)
的函數來看到它。最好將初始化分配與分配分開,因爲您可以使用此函數初始化已分配給堆棧的項目。類似的原則適用於析構函數。
大多數人覺得Hungarian notation大約爲可讀書面匈牙利。唯一的例外是母語匈牙利語音箱,誰通常會發現大約爲清晰的Cuneiform.匈牙利命名法。不幸的是,匈牙利符號在Windows軟件中被廣泛使用,並且整個Win32 API都使用它,預計會在此平臺上編寫軟件的易讀性。
C/Unix的書籍,甚至是真正好的像已故的理查德·史蒂文斯寫的那些傾向於通過亞馬遜市場上可供二手相當便宜。在沒有特定的順序,得到的K&R,史蒂文斯APUE和UNP 1& 2,副本Dragon book,Rochkind,Programming Pearls,Petzold和Richter(如果使用的是Windows)和任何其他經典的C/Unix的工作。閱讀,用鉛筆在它們上面塗寫,通常與書籍互動。
網上有很多很多很好的C/Unix programming資源。
閱讀並理解Ten Commandments of C Programming以及一些關於誡命背後的原因和理由的元討論。這正顯示出它的年齡在一定程度上,雖然大部分仍然是相關的和模糊的編譯器仍然quite common in the embedded systems world。
Lex and Yacc是你的朋友,如果你想編寫解析器。
作爲Navicore points out below (+1),Hanson的'C Interfaces and Implementations'是一個用於模塊化架構的接口/實現設計的破解,其中包含大量示例。其實我聽說過這本書,並且聽到了好消息,雖然我不能宣稱已經讀過它。除了我上面描述的C語言,這個概念可以說是良好的程序設計的核心。事實上,Modula-2等其他過程語言實際上在設計中明確地表達了這個概念。這可能是最接近「C程序體系結構」書籍的版本。
閱讀C FAQ。
這裏的一些interesting responses來自一個關於C中OO編程的不同問題。我做了一篇關於一些C代碼的文章,這些代碼基本上推動了面向對象的方向,因爲它不包含虛擬方法。
如果我在做C編碼,我會用這種技術來定義'對象'。
我發現保留Design Patterns總是有幫助的,並且可以在大多數語言中實現。
這裏有一個很好的PDF討論object oriented C programming。
MINIX通過的Tanenbaum
大衛漢森的「C接口和實現」中解決了我從OO回到C的擔憂。
C Interfaces and Implementations
嚴重的是,它的做法,避免意外建設大球紗,許多非面向對象的系統拉閘由於作出了巨大的差異。
雖然它被寫成語言不可知的文本,但Code Complete提供了許多關於代碼結構和組織的良好指導以及構造實踐。
更大的應用程序? C的優勢在於當你必須處理設備驅動程序,調度程序和其他操作系統風格的低級事物時。
你可以使操作類似於面向對象的C,但將utlimately彷彿置身於一個運動重新發明輪子..
一個次要的事情是「倒退」爲了你的.c文件 - 即把主()在文件的底部,並且始終確保本地函數(不在您的.h文件中的那些文件,您剛剛爲該文件使用而編寫的文件)位於第一次使用的位置之上。這意味着你不必爲它們編寫原型,如果你不得不改變它們的API,那麼這是一件小事。
然後,作爲獎勵,在「gD的」 vim的命令總是會去一個函數的定義,如果是在同一個文件:
學習C大概是你能做的最好的事情之一真正擴展你的技能。我知道這可能並不是很多「現代」程序員習慣於聽到這些日子,但這是事實。我認爲你學習它的願望是一個非常聰明的舉動。 – 2009-05-29 19:06:31
真棒問題,我處於相同的位置。 C本身是相當小的,但是當編寫更大的應用程序時,我也堅持如何設計它們...... – 2011-01-03 10:28:58