Re: [問題] C語言模組化的基礎問題

看板C_and_CPP作者 (好人超)時間7年前 (2017/05/18 20:08), 7年前編輯推噓8(804)
留言12則, 10人參與, 最新討論串2/2 (看更多)
我在寫C語言模組化的時候 並不會試圖想模擬C++的物件導向 但我會用這個方法去思考: 把每個C檔案視為一個class,檔案內的變數與函式是member C檔案內的東西盡可能的設為static,也就是當作private來使用 class foo { public: foo() { } void job1() { } int get_job_id() { return job_id; } private: void priv_job() { } int job_id; }; 寫成C就是 foo.h void init(); void job1(); int get_job_id(); foo.c static int job_id; void init() { } void job1() { } int get_job_id() { return job_id; } static void priv_job() { } 我覺得這樣做,就可以做到相當程度的封裝了 把內部的實作與外部的介面分清楚 header file只放置"我要給別人用的東西",也就是"應該public"的東西就好 把header file當作c++的abstract class(或java的interface)來用 另外,可以用function pointer的方式去提供某種程度的多型 在C++的時候我們這麼寫 http://ideone.com/hZ5i86 在C的時候可以這麼寫 http://ideone.com/h6YLkY 如果有需要的話,也可以把struct的指標傳進相關的function 做為類似C++的this pointer來使用 雖然C語言先天要模擬"繼承"並不好做 不過我覺得封裝與多型可以很好的發揮,也可以把程式寫得很模組化了 最後,我覺得有個project,非常厲害的做到了C語言嵌入式系統的模組化 Chromebook的embedded controller https://www.chromium.org/chromium-os/ec-development 在有限的資源裡(不算強悍的CPU,有限的RAM,最大256KB的code size) 盡可能的支援最多的功能、最大的彈性,並且互相不干擾 功能幾乎可以獨立的開關、置換,我在這個東西上學了很多 很多純C的Open source專案,譬如Linux kernel或UEFI BIOS也用了很多這種觀念 不過那種超級大怪物等級的東西就比較難用來學習了orz -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.136.47.123 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1495109296.A.7A8.html ※ 編輯: james732 (223.136.47.123), 05/18/2017 20:19:26

05/18 22:15, , 1F
不過這會碰到很多人的痛:撞名 XD
05/18 22:15, 1F

05/18 22:16, , 2F
三五不時就發現以前能跑的code 多include一個就炸掉了
05/18 22:16, 2F

05/18 22:35, , 3F
現實中會看到 void james732_foo_init(); 這種命名
05/18 22:35, 3F

05/18 22:51, , 4F
感謝您 非常清楚詳細
05/18 22:51, 4F

05/19 01:57, , 5F
這篇好
05/19 01:57, 5F

05/19 07:10, , 6F
沒有namespace 跟overload 真的有點痛苦 xD 推這篇
05/19 07:10, 6F

05/19 09:37, , 7F
推這篇,我在專案上的規劃也差不多這樣
05/19 09:37, 7F

05/19 16:39, , 8F
推 之前也是這樣做 但public function命名前頭會加模組名
05/19 16:39, 8F

05/20 16:24, , 9F
不過用static的話可能就不適合做multithreading了...
05/20 16:24, 9F

05/22 19:09, , 10F
Linux kernel幾乎都長這樣XD
05/22 19:09, 10F

05/23 01:44, , 11F
推, 最近追 uboot , 發現蠻多是模擬 class 作法。
05/23 01:44, 11F

05/23 01:45, , 12F
讓我覺得最噁心的還是 list 那段 macro
05/23 01:45, 12F
文章代碼(AID): #1P7OwmUe (C_and_CPP)
文章代碼(AID): #1P7OwmUe (C_and_CPP)