2009-05-29 88 views
47

來自OO背景(C#/ java)我正在尋找資源來學習如何很好地設計純C程序。學習C程序設計資源

雖然我熟悉C的語法,並且我可以編寫小程序,但我不確定採用哪種方法來處理大型應用程序,以及採用何種技術。任何你可以推薦的東西。編輯:我很高興完全放棄面向對象編程目的在C中,我的興趣在於學習如何構造一個沒有面向對象的程序,我想了解如何在過程語言中設計程序的好方法,如C.

+8

學習C大概是你能做的最好的事情之一真正擴展你的技能。我知道這可能並不是很多「現代」程序員習慣於聽到這些日子,但這是事實。我認爲你學習它的願望是一個非常聰明的舉動。 – 2009-05-29 19:06:31

+0

真棒問題,我處於相同的位置。 C本身是相當小的,但是當編寫更大的應用程序時,我也堅持如何設計它們...... – 2011-01-03 10:28:58

回答

45

This posting擁有的UNIX書籍列表,其中包括最經典的C/Unix的作品。對於Windows上的C編程,Petzold的Programming Windows可能是最好的開始。

對於C程序設計,一些unix編程書籍會告訴你片段,但我不知道「C程序結構」一書。

如果你使用到Java,一些技巧對C編程有:

  1. Makeuseofstack。通常當你調用一個過程時,你會希望在調用者的棧幀中分配變量,並將指針傳遞給你想調用的過程。這將比使用malloc()動態分配內存的速度快得多,而且容易出錯。在適當的地方做到這一點。

  2. C沒有做garbage collection,所以動態地分配數據項是更繁瑣,你必須跟蹤它們在棧上分配make sure they get freed.變量(參見圖1)是更多的「地道」,他們都是適用的。另外,你不必釋放它們 - 這是局部變量的獎勵。 (2)的適用,考慮一種體系結構,其中你的函數返回一個狀態或錯誤代碼並根據(1)使用棧傳入和傳出數據。

  3. 瞭解setjmp()longjmp()做些什麼。它們對通用錯誤處理機制非常有用,而不是結構化的異常處理功能。

  4. C does not support exceptions.參見(3)。

  5. Lint是你的朋友。 Splint更友好。

  6. 瞭解什麼preprocessor做什麼,如果你能,你不應該用它做均勻。

  7. 瞭解endian-ness,word alignment,pointer arithmetic和其他低級建築奧祕的來龍去脈。與流行觀點相反,這些不是火箭科學。如果您感覺敏銳,請嘗試使用匯編語言,並掌握相關知識。它會爲你理解C程序中發生的事情做很多事情。

  8. C沒有模塊範圍的概念,因此計劃使用include,原型聲明以及使用externstatic來創建私有範圍和導入標識符。

  9. 用C
  10. GUI編程是allplatforms.

  11. 的中肯乏味(10)學習的至少一個腳本語言的C API諸如TclLuaPython.在許多情況下C的最佳使用是作爲一個核心的高性能引擎,基本上是用別的東西編寫的應用程序。

  12. 構造相對應的是,你的光標到需要設定的項目傳遞一個正在初始化函數。通常你可以通過調用看起來像setup_foo(&my_foo)的函數來看到它。最好將初始化分配與分配分開,因爲您可以使用此函數初始化已分配給堆棧的項目。類似的原則適用於析構函數。

  13. 大多數人覺得Hungarian notation大約爲可讀書面匈牙利。唯一的例外是母語匈牙利語音箱,誰通常會發現大約爲清晰的Cuneiform.匈牙利命名法。不幸的是,匈牙利符號在Windows軟件中被廣泛使用,並且整個Win32 API都使用它,預計會在此平臺上編寫軟件的易讀性。

  14. C/Unix的書籍,甚至是真正好的像已故的理查德·史蒂文斯寫的那些傾向於通過亞馬遜市場上可供二手相當便宜。在沒有特定的順序,得到的K&R,史蒂文斯APUEUNP 1& 2,副本Dragon book,Rochkind,Programming Pearls,PetzoldRichter(如果使用的是Windows)和任何其他經典的C/Unix的工作。閱讀,用鉛筆在它們上面塗寫,通常與書籍互動。

  15. 網上有很多很多很好的C/Unix programming資源。

  16. 閱讀並理解Ten Commandments of C Programming以及一些關於誡命背後的原因和理由的元討論。這正顯示出它的年齡在一定程度上,雖然大部分仍然是相關的和模糊的編譯器仍然quite common in the embedded systems world

  17. Lex and Yacc是你的朋友,如果你想編寫解析器。

  18. 作爲Navicore points out below (+1),Hanson的'C Interfaces and Implementations'是一個用於模塊化架構的接口/實現設計的破解,其中包含大量示例。其實我聽說過這本書,並且聽到了好消息,雖然我不能宣稱已經讀過它。除了我上面描述的C語言,這個概念可以說是良好的程序設計的核心。事實上,Modula-2等其他過程語言實際上在設計中明確地表達了這個概念。這可能是最接近「C程序體系結構」書籍的版本。

  19. 閱讀C FAQ

2

這裏的一些interesting responses來自一個關於C中OO編程的不同問題。我做了一篇關於一些C代碼的文章,這些代碼基本上推動了面向對象的方向,因爲它不包含虛擬方法。

如果我在做C編碼,我會用這種技術來定義'對象'。

我發現保留Design Patterns總是有幫助的,並且可以在大多數語言中實現。

這裏有一個很好的PDF討論object oriented C programming

+1

如果您想在C中執行OO,則應該真正使用C++。如果你想使用C,你應該寫出漂亮,清晰的程序代碼。 – 2009-05-29 12:47:38

+1

「如果你想使用C,你應該寫出漂亮,清晰的程序代碼。」 你能推薦任何資源來學習如何做到這一點?這是我正在尋找的東西。 – Kingsley 2009-05-29 13:31:40

+0

有些情況下需要使用C.並非所有的處理器都具有C++編譯器 - 特別是如果您正在進入嵌入式環境。當您使用代碼在低級硬件上運行時,使用C編寫代碼仍然符合您的最佳利益,然後使用C++包裝器。 – Kieveli 2009-05-29 13:37:01

2

MINIX通過的Tanenbaum

6

大衛漢森的「C接口和實現」中解決了我從OO回到C的擔憂。

C Interfaces and Implementations

嚴重的是,它的做法,避免意外建設大球紗,許多非面向對象的系統拉閘由於作出了巨大的差異。

0

雖然它被寫成語言不可知的文本,但Code Complete提供了許多關於代碼結構和組織的良好指導以及構造實踐。

1

更大的應用程序? C的優勢在於當你必須處理設備驅動程序,調度程序和其他操作系統風格的低級事物時。

你可以使操作類似於面向對象的C,但將utlimately彷彿置身於一個運動重新發明輪子..

1

一個次要的事情是「倒退」爲了你的.c文件 - 即把主()在文件的底部,並且始終確保本地函數(不在您的.h文件中的那些文件,您剛剛爲該文件使用而編寫的文件)位於第一次使用的位置之上。這意味着你不必爲它們編寫原型,如果你不得不改變它們的API,那麼這是一件小事。

然後,作爲獎勵,在「gD的」 vim的命令總是會去一個函數的定義,如果是在同一個文件: