日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
C語言對模塊化支持的欠缺

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

創(chuàng)新互聯專業(yè)為企業(yè)提供東西湖網站建設、東西湖做網站、東西湖網站設計、東西湖網站制作等企業(yè)網站建設、網頁設計與制作、東西湖企業(yè)網站模板建站服務,十載東西湖做網站經驗,不只是建網站,更提供有價值的思路和整體網絡服務。

除開 C/C++ ,在其它現在流行的開發(fā)語言中,缺少標準化的模塊管理機制是很難想象的。但這也是 C 語言本身的設計哲學決定的:把盡可能多的可能性留給程序員。根據實際的系統,實際的需要去定制自己需要的東西。

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

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

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

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

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

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

誰先初始化,誰后初始化,這是一個問題。

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

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

 
 
 
  1. int foo_init() 

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

為了避免模塊重復初始化,初始化函數并不直接調用,而是間接的。類似這樣:

 
 
 
  1. mod_using(foo_init); 

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

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

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

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

這樣,我的系統中模塊模塊的實現代碼最后,都有一個 init 函數,里面只是簡單的調用了 USING 來引用別的模塊。例如:

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

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

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


分享題目:C語言對模塊化支持的欠缺
標題來源:http://m.5511xx.com/article/dpjideh.html