成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C 語言對模塊化支持的欠缺

開發(fā) 后端
除開 C/C++ ,在其它現(xiàn)在流行的開發(fā)語言中,缺少標(biāo)準(zhǔn)化的模塊管理機(jī)制是很難想象的。但這也是 C 語言本身的設(shè)計(jì)哲學(xué)決定的:把盡可能多的可能性留給程序員。根據(jù)實(shí)際的系統(tǒng),實(shí)際的需要去定制自己需要的東西。

模塊化是最高原則之一(在 《Unix 編程藝術(shù)》一書中, Unix 哲學(xué)第一條即:模塊原則),我們就當(dāng)考慮如何簡潔明快的使用 C 語言實(shí)現(xiàn)模塊化。

除開 C/C++ ,在其它現(xiàn)在流行的開發(fā)語言中,缺少標(biāo)準(zhǔn)化的模塊管理機(jī)制是很難想象的。但這也是 C 語言本身的設(shè)計(jì)哲學(xué)決定的:把盡可能多的可能性留給程序員。根據(jù)實(shí)際的系統(tǒng),實(shí)際的需要去定制自己需要的東西。

對于巨型的系統(tǒng)(比如 Windows 這樣的操作系統(tǒng)),一般會考慮使用一種二進(jìn)制級的模塊化方案。由模塊自己提供元信息,或是使用統(tǒng)一的管理方案(比如注冊表)。稍小一點(diǎn)的系統(tǒng)(我們通常開發(fā)接觸到的),則會考慮輕量一些的源碼級方案。

首先要考慮的往往是模塊的依賴關(guān)系和初始化過程。

依賴關(guān)系可以放由鏈接器或加載器來解決。尤其在使用 C 語言時(shí),簡單的靜態(tài)庫或動態(tài)庫,都不太會引起大的麻煩。

C++ 則不然,C++ 的某些特性(比如模板類靜態(tài)成員的構(gòu)造)必須對早期只供 C 語言使用的鏈接器做一些增強(qiáng)。即使是精心編寫的 C++ 庫,也有可能出現(xiàn)一些意外的 bug 。這些 bug 往往需要對編譯,鏈接,加載過程很深刻的理解,才能查出來。注:我并不想以此來反對使用 C++ 做開發(fā)。

我們需要著重管理的,是模塊的初始化過程。

對于打包在一起的一個(gè)庫(例如 glibc ,或是 msvcrt ),會在加載時(shí)有初始化入口,以及卸載時(shí)有結(jié)束代碼。我想說的不是這個(gè),而是我們自己內(nèi)部拆分的更小的模塊的相互依賴關(guān)系。

誰先初始化,誰后初始化,這是一個(gè)問題。

在 C++ 的語言級解決方案中,使用的是單件模塊。要么由鏈接器決定以怎樣的次序來生成初始化代碼,這,通常會因?yàn)橐蕾囮P(guān)系和實(shí)際構(gòu)造次序不同而導(dǎo)致 bug (注:我在某幾本 C++ 書中都見過,待核實(shí)。自己好久不寫 C++ 也沒有實(shí)際的錯(cuò)誤例子);要么使用惰性初始化方案。這個(gè)惰性初始化也不是萬能的,并且有些額外的開銷。(多線程環(huán)境中尤其需要注意)

我使用 C 語言做初期設(shè)計(jì)的時(shí)候,采用的是一種足夠簡單的方法。就是,以編碼規(guī)范來規(guī)定,每個(gè)模塊必須存在一個(gè)初始化函數(shù),有規(guī)范的名字。比如 foo 模塊的初始化入口叫

  1. int foo_init() 

規(guī)定:凡使用特定模塊,必須調(diào)用模塊初始化函數(shù)。

為了避免模塊重復(fù)初始化,初始化函數(shù)并不直接調(diào)用,而是間接的。類似這樣:

  1. mod_using(foo_init); 

mod_using 負(fù)責(zé)調(diào)用初始化函數(shù),并保證不重復(fù)調(diào)用,也可以檢查循環(huán)依賴。

在這里,我們還約定了初始化成功于否的返回值。(在我們的系統(tǒng)中,返回 0 表示正確,1 表示失?。┤缓蠖x了一個(gè)宏來做這個(gè)使用。

  1. #define USING(m) if (mod_using(m##_init,#m)) { return 1; } 

注:我個(gè)人反對濫用宏。也盡可能的避免它。這里使用宏,經(jīng)過了慎重的考慮。我希望可以有一個(gè)代碼掃描器去判斷我是否漏掉了模塊初始化(可能我使用了一個(gè)模塊,但忘記初始化它)。宏可以幫助代碼掃描分析器更容易實(shí)現(xiàn)。而且,使用宏更像是對語言做的輕微且必要的擴(kuò)展。

這樣,我的系統(tǒng)中模塊模塊的實(shí)現(xiàn)代碼最后,都有一個(gè) init 函數(shù),里面只是簡單的調(diào)用了 USING 來引用別的模塊。例如:

  1. #include "module.h"  
  2. /*  
  3. 我個(gè)人偏愛把 module.h 的引入放在源文件最后,初始化入口之前。  
  4. 它里面之定義了 USING 宏,以及相關(guān)管理函數(shù)。  
  5. 這樣做是為了避免在代碼的其它地方去引入別的模塊。  
  6. */ 
  7. int 
  8. foo_init()  
  9. {  
  10. USING(memory); // 引用內(nèi)存管理模塊  
  11. USING(log); // 引用 log 模塊  
  12. return 0;  

至于模塊的卸載,大部分需求下是不需要的。今天在這里就不論證這一點(diǎn)了。

原文鏈接:http://blog.codingnow.com/2010/01/c_modularization.html

【編輯推薦】

  1. CSS模塊化編碼 讓開發(fā)事半功倍
  2. 學(xué)習(xí)筆記 Flex模塊化詳盡解讀
  3. OSGi,Java模塊化框架的另類進(jìn)化
  4. Python編程語言如何進(jìn)行模塊化修改
  5. 2.3 模塊化程序設(shè)計(jì)
責(zé)任編輯:于鐵 來源: 云風(fēng)的 BLOG
相關(guān)推薦

2011-05-13 15:54:50

C模塊化

2010-01-20 09:14:49

C語言模塊化

2016-12-14 14:50:26

CSS預(yù)處理語言模塊化實(shí)踐

2019-08-28 16:18:39

JavaScriptJS前端

2020-09-18 09:02:32

前端模塊化

2020-09-17 10:30:21

前端模塊化組件

2010-08-24 16:07:37

C語言

2009-08-17 10:11:12

C# Windows

2017-09-22 18:50:50

模塊化Java 9發(fā)布

2021-04-06 10:19:36

Go語言基礎(chǔ)技術(shù)

2010-03-11 17:24:27

Python編程語言

2016-10-09 11:03:41

Javascript模塊化Web

2022-09-05 09:01:13

前端模塊化

2023-12-25 22:24:36

C++模塊Module

2022-09-21 11:51:26

模塊化應(yīng)用

2014-07-15 11:16:17

Go語言

2013-08-20 15:31:18

前端模塊化

2017-05-18 10:23:55

模塊化開發(fā)RequireJsJavascript

2015-10-10 11:29:45

Java模塊化系統(tǒng)初探

2022-03-11 13:01:27

前端模塊
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 欧美理论片在线观看 | 成人免费精品视频 | 毛片大全 | 国产在线观看网站 | 久久综合狠狠综合久久 | 久久久久国产精品午夜一区 | 成人h免费观看视频 | 久久色视频 | 欧美一级免费看 | 久久久久久美女 | 亚洲一区 中文字幕 | 国产久 | 色吊丝2288sds中文字幕 | 亚洲成av人影片在线观看 | 亚洲一区精品在线 | 欧美二区乱c黑人 | 精品一区二区久久久久久久网站 | 犬夜叉在线观看 | 毛片一级网站 | 国产成人精品免费视频大全最热 | 精品一二区 | 天啪 | 一级毛片播放 | 久久久久久久久久久久久9999 | av看片网站 | 青青艹在线视频 | jizz亚洲人| 欧美 日韩 国产 成人 在线 91 | 亚洲精品一区二区三区 | 亚洲性视频 | 欧美成人视屏 | 一区二区三区免费 | 欧美视频一区 | h视频免费看 | 国产精品视频一区二区三区, | 色婷婷久久综合 | 欧美三级在线 | 国产在线a| 国产精品1区2区3区 国产在线观看一区 | 欧美色视频免费 | 精品少妇v888av |