2010-11-16 86 views
3

有沒有人有關於如何以最佳方式構建C代碼項目的技巧/資源? (不同的文件夾等)你怎麼知道什麼時候把代碼分成單獨的文件是好的?什麼是一個好的Makefile的例子?構建C代碼的技巧/資源?

我的項目是不那麼大,但是我想開始在早期階段構建我的代碼..

回答

2

構建代碼需要一定的經驗,但大多是常識。

對於拆分代碼,通常要求可讀性:概念上相關的函數/數據類型應該放在同一個文件中。您可以將c標準庫作爲一個好例子。最好將數據結構定義和函數聲明保存在不同的頭文件中。這允許您將數據結構作爲編譯單元的一部分使用,即使您尚未定義所有功能。

提供類似功能的文件應該放在同一個目錄中。避免深層目錄結構(最好是1層深度)是很好的,因爲這會使項目不必要地複雜化。

我認爲Makefiles可以用於小型項目,但對於較大的項目會變得笨重。對於認認真真的工作(如果你想發佈您的代碼,創建一個安裝等),你可能想看看CMake的,使用SCons等

看一看在GNU編碼標準:http://www.gnu.org/prep/standards/standards.html

看gnu make一個簡單的例子Makefile的手冊。你也可以選擇任何開源項目並查看Makefile。在sourceforge.net中瀏覽代碼庫可能會有用。

+0

如果你要談論GNU標準,你應該提及'automake'。它節省了很多時間來製作符合標準的'Makefile's,並且它比CMake更好(當然,雖然不那麼漂亮,但肯定更好)。 – 2010-11-16 20:34:10

+0

這是有爭議的,看起來社區正在逐漸遠離automake。我毫不懷疑gnu autotools對於許多項目多年來都非常有用,但是有更新的工具從中獲得了經驗: – subhacom 2010-11-17 06:44:19

+1

這裏有一些鏈接:http://lwn.net/Articles/188693/和http ://www.scons.org/wiki/SconsVsOtherBuildTools和http://ubuntu-ky.ubuntuforums.org/showthread.php?t=976922 – subhacom 2010-11-17 06:51:17

0

這有時會被忽視,但安全性是大項目中的一個問題。這裏有一些關於如何program securely的建議。

0

下面是一個成語我喜歡:

申報struct S IN的報頭,使得它們的大小是由客戶機代碼已知的。然後將init和deinit函數聲明爲以下約定:

  • 第一個參數是struct foo*
  • 返回類型是struct foo*
  • 如果他們可能失敗,最後一個參數是int*(最簡單),enum foo_error*(如果有多種方式可能會失敗,調用代碼可能會關心)或GError**(如果您正在編寫GLib樣式的代碼)。

foo_init()foo_deinit()回報NULL如果第一個參數是NULL。他們還返回第一個參數。

爲什麼這樣呢?調用代碼不必爲結構分配堆空間,它可以放在堆棧上。如果您在堆中分配的,雖然,以下工作得很好:

struct foo* a_foo = foo_init(malloc(sizeof(*a_foo))); 
if (a_foo == NULL) { 
    /* Ruh-oh, allocation failure... */ 
} 
free(foo_deinit(a_foo)); 

一切都工作得很好,即使a_foo == NULLfoo_deinit被調用。