嵌入式軟件開發 - C語言程序設計

這里分享一些關于C語言程序設計方面的心得吧,一點淺見,見笑見笑。

C語言也可以實現面向對象設計

面向對象是一種方法,雖然C語言不是面向對象語言也可以做到面向對象設計。首先來看看對象主要包含什么:

  1. 屬性集合
  2. 方法集合
  3. 方法里能訪問對象上下文

我們先看看屬性,C語言里的結構體就能實現這一點,一個結構體定義一些字段,這些字段的集合是不是就能看做是屬性集合了。

typedef struct Person_st
{
    char name[20];
    int age;
}Person_t

然后再來看看2,我們認為按約定定義好一些方法,說這個就是對象的方法就行,面向對象不是非得說同過"."或"->"調用才是對象方法吧。比如:

PersionSetName();
PersionSetAge();

這里先不考慮函數里面實現的問題,我們可以約定這么定義對象的方法『對象名+方法名』。當然你想要的『->』調用也是可以的。

typedef struct Person_st
{
    char name[20];
    int age;
    void (*setName)();
    void (*setAge)();
}Person_t

Person persion;
person->setName();
person->setAge();

通過函數指針來實現,事實上Linux內核中就是這么做的。

最后再來看3,如何訪問對象上下文的問題,在C++或其他面向對象語言中,直接在方法內通過this來訪問對象是天經地義的事,但是在C語言由于本身不支持就需要我們費些功夫來實現了。

方式1

typedef struct Person_st
{
    char name[20];
    int age;
}Person_t

void PersonSetName(Person_t *p, const char *name);
void PersonSetAge(Person_t *p, int age);

方式2

typedef struct Person_st
{
    char name[20];
    int age;
    void (*setName)(Person_t *p, const char *name);
    void (*setAge)(Person_t *p, int age);
}Person_t

我們主動把對象傳進給函數。這里我們就能在C語言上進行面向對象的程序設計了。至于方式1和方式2哪個好用,我個人喜歡用方式1,一個是不需要初始化函數指針,再者就是結構體占用的內存更小。

模塊化設計

其實程序設計和任務分解一樣,你把一個大的功能不斷細分,把一個大模塊分解成小模塊,最終無數個小模塊組成一個完整的程序。每次面對的都是一個個小功能,一者是當前需要面對的情況簡單了,一者就是需要思考的點少了,不會出現無從下手的情況。有很多將程序設計方面的書這里就不多細說了。

非阻塞系統設計

另外說一下自己關于程序設計的一點感悟吧,非阻塞系統設計。

這里先說接口,一般接口分為兩種,一種是阻塞的,等到所有數據處理完成再返回,一種是非阻塞的,調用接口時只是相當于一個觸發信號,等處理完成一般通過回調函數返回。

這里分析一下兩種方式,第一種接口,設計簡單,使用也比較簡單,都是線性思維的,但是帶來的影響就是整個系統會阻塞,不說單片機阻塞了就相當于把整個系統阻塞了,就算是用多線程也會帶來線程同步的問題,而線程同步是最容易出問題也是出了問題最不好查的地方。

第二種,所有的接口都是非阻塞的,需要等待獲取結果的通過回調函數來返回。不好的地方就是這時候思維不是線性的,先調用接口然后再在回調返回的地方再處理結果。好處就是你不會因為處理一項事物而阻塞了其他事物的執行,系統的響應實時性是高的。

特別是在多線程系統中,假設所有的邏輯都是非阻塞的也就沒必要再開線程了,也就根本不需要考慮線程間同步的問題。當然這里是需要一點小技巧的,因為系統里總有耗時的任務,原則上是只把耗時的任務交給線程處理,在處理完成有結果的時候把處理結果回調時又切回去主線程,對于使用接口的人來說完全不需要考慮線程同步的問題,只需要處理好業務邏輯就行了,對于開發效率的提升是非常明顯的。有興趣的可以看看Node.js的事件驅動,非阻塞IO模型。Node.js的接口就完全是異步的,而且居然連能創建線程的接口都沒有。

最小暴露原則

最小暴露原則說的就是,僅在頭文件中暴露外部需要使用的類型、宏、函數和全局變量,所有不需要給外部使用的都不放在對外公開的頭文件中,比如我定義一個模塊會是這樣的:

Person.c
Person.h
PersonInternal.h

所有不想對外暴露的接口,僅對內暴露的接口都定義在Inter.h頭文件中。

  • 私有實現

對象中如果有些字段覺得沒必要暴露出來的可以選擇私有實現,如下定義一個PersonPri_t類型,但是在頭文件里面只有聲明,實現定義在.c文件中。

typedef struct PersonPri_st PersonPri_t;

typedef struct Person_st
{
    char name[20];
    int age;
    void (*setName)();
    void (*setAge)();

    PersonPri_t *pri;
}Person_t
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,775評論 25 708
  • 從三月份找實習到現在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發崗...
    時芥藍閱讀 42,339評論 11 349
  • 轉自http://blog.csdn.net/xugangwen/article/details/44811783...
    扎Zn了老Fe閱讀 12,787評論 1 142
  • 裂·息封 黎明前微醺的瑣碎光線 黃昏后黯淡的細小云絲 應該是溫潤 和很多很多沉靜的波動 你的眸目唇齒 應該是那些的...
    GEM小甜心閱讀 251評論 0 0
  • 米蘭·昆德拉一直在尋找隱藏在真實生活背后的荒誕的意義,即便是在他寫出《生活在別處》之后,他也沒曾想放棄過這種努力。...
    何鵬在簡書閱讀 945評論 0 1