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

作者: james732 (好人超)   2017-05-18 20:08:07
我在寫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
作者: Killercat (殺人貓™)   2017-05-18 22:15:00
不過這會碰到很多人的痛:撞名 XD三五不時就發現以前能跑的code 多include一個就炸掉了
作者: uranusjr (←這人是超級笨蛋)   2017-05-18 22:35:00
現實中會看到 void james732_foo_init(); 這種命名
作者: pride829 (竹鼠)   2017-05-18 22:51:00
感謝您 非常清楚詳細
作者: chuegou (chuegou)   2017-05-19 01:57:00
這篇好
作者: steve1012 (steve)   2017-05-19 07:10:00
沒有namespace 跟overload 真的有點痛苦 xD 推這篇
作者: boss0405 (boss)   2017-05-19 09:37:00
推這篇,我在專案上的規劃也差不多這樣
作者: xvid (DivX)   2017-05-19 16:39:00
推 之前也是這樣做 但public function命名前頭會加模組名
作者: wtchen (沒有存在感的人)   2017-05-20 16:24:00
不過用static的話可能就不適合做multithreading了...
作者: michael0728n (蒜˙遠古)   2017-05-22 19:09:00
Linux kernel幾乎都長這樣XD
作者: EdisonX (卡卡獸)   2017-05-23 01:44:00
推, 最近追 uboot , 發現蠻多是模擬 class 作法。讓我覺得最噁心的還是 list 那段 macro

Links booklink

Contact Us: admin [ a t ] ucptt.com