作者james732 (好人超)
看板C_and_CPP
标题Re: [问题] C语言模组化的基础问题
时间Thu May 18 20:08:07 2017
我在写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://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1495109296.A.7A8.html
※ 编辑: james732 (223.136.47.123), 05/18/2017 20:19:26
1F:推 Killercat: 不过这会碰到很多人的痛:撞名 XD 05/18 22:15
2F:→ Killercat: 三五不时就发现以前能跑的code 多include一个就炸掉了 05/18 22:16
3F:→ uranusjr: 现实中会看到 void james732_foo_init(); 这种命名 05/18 22:35
4F:推 pride829: 感谢您 非常清楚详细 05/18 22:51
5F:推 chuegou: 这篇好 05/19 01:57
6F:推 steve1012: 没有namespace 跟overload 真的有点痛苦 xD 推这篇 05/19 07:10
7F:推 boss0405: 推这篇,我在专案上的规划也差不多这样 05/19 09:37
8F:推 xvid: 推 之前也是这样做 但public function命名前头会加模组名 05/19 16:39
9F:→ wtchen: 不过用static的话可能就不适合做multithreading了... 05/20 16:24
10F:推 michael0728n: Linux kernel几乎都长这样XD 05/22 19:09
11F:推 EdisonX: 推, 最近追 uboot , 发现蛮多是模拟 class 作法。 05/23 01:44
12F:→ EdisonX: 让我觉得最恶心的还是 list 那段 macro 05/23 01:45