使用C語言來實現模組化

來源:互聯網
上載者:User

標籤:art   foo   開發人員   代碼掃描   msvc   編程   window   簡單的   存在   

除了C語言以及C++程式設計語言之外,在其它現在非常流行的開發語言中,比如說:java,php,jsp等等。我們很難想象到缺少標準化的模組管理機制是一件多麼可怕的事情。但是這往往也是由C語言本身的設計哲學決定出來的:將儘可能多的可能性留給開發人員。然後根據實際情況的系統,根據大家的實際需要來定製一些自己所需要的東西。

  對於一些稍微小一點的系統來說(就是我們在開發過程中通常會接觸到的系統),一般情況下我們都會考慮選擇輕量一些的源碼級方案。假如不是小的系統,相反是一些巨型系統來說(就比如說:類似Windows這樣的作業系統),那麼一般我們都會考慮使用一種二進位級的模組化方案。由模組它自己來提供元資訊,又或者是我們還可以使用統一的管理方案(就比如說:註冊表等工具)。

  但是我們首先往往要考慮到一個問題,那就是模組的初始化過程以及依賴關係這兩個部分。

  1、依賴關係

  其實依賴關係這一個部分我們可以放由載入器又或者是連結器來進行解決。尤其大家在使用C語言的時候,簡單的動態庫或者是靜態庫,通通都不太會給我們引起很大的麻煩,所以大家可以非常的放心。

  但是C++程式設計語言卻不是這樣了,在C++中有某一些特性(就比如說模板類靜態成員的構造)就一定要對早期只供C語言使用的連結器做一些增強。就算是一些很精心去進行編寫的C++庫,也有可能會出現一些意外的bug(即程式錯誤)。這些程式錯誤往往如果想要查詢出來的話,往往就需要對連結,載入過程,編譯有很深刻的理解,才可以查出來。在這裡大家要注意一點哦,那就是小編寫這一段話,並不說要根據這樣來反對大家使用C++程式設計語言來進行開發程式。

  2、模組的初始化過程

  那麼我們往往更需要著重管理的,則是模組的初始化過程這一部分。

  對於一些打包在一起的一個庫(比如說:msvcrt又或者是glibc等),往往都會在載入的時候有一個初始化入口,以及卸載的時候都會有結束的代碼。但是小編在這裡想說的不是這一個問題,而是大家內部拆分的更小的模組的相互依賴關係。問題就是在於:究竟誰先初始化,誰後初始化呢?

  通常使用C++程式設計語言的朋友,都應該發現他的語言級解決方案中,經常使用到的都是單件模組。要麼就是由連結器決定以怎樣的一個次序來進行產生初始化代碼。但是這經常就會因為實際構造次序不同以及依賴關係,從而導致了程式錯誤的發生(注意事項:小編在好幾本關於C++書籍中都見過,待核實。其實小編自己在好久不寫C++也並沒有實際的錯誤例子出現);要麼就是使用惰性初始化方案。但是大家也應該知道這個惰性初始化也不是萬能鑰匙來的,另外還有一些額外的開銷了。所以,如果是在多線程環境中就一定要尤其需要注意這一點了。

  小編在使用C語言製作初期設計時,往往都採用一種足夠簡單方便的方法。這種簡便的方法就是,用編碼的規範來進行規定,每一個模組都一定要存在一個初始化函數,要有一個較為規範的名字。就比如說:foo模組的初始化入口叫做:int foo_init()。

  假如說大家使用了特定的模組,那麼就一定要調用模組初始化函數。這是一個規定來的喲,所以大家一定要遵循咯。

  大家一定要注意一點,那就是:初始化函數是間接調用的,並不是直接調用的。這樣的做法,為了要避免發生模組重複初始化的問題。就類似一下這種:mod_using(foo_init);。

  mod_using的主要作用就是:負責調用初始化函數,並且還可以保證不重複調用,另外它還可以為我們檢查一下循環相依性。

  在這裡的話,我們還約定了初始化是否成功就在於它的一個傳回值。(一般情況下在我們的系統中,如果傳回值是1的話,那就代表著失敗;相反如果是0的話,那就代表著正確)然後我們再定義了一個宏來製作這個使用。:

  注意事項:就個人而言,小編是特別反對濫用宏的。所以大家也要儘可能的避免使用到宏。在這裡小編使用了宏,都是經過了謹慎的考慮才決定使用的。為了可以去判斷一下自己究竟是否真的漏掉了模組初始化,小編卻希望可以有一個代碼掃描器幫我去判斷(可能小編會使用了一個模組,但是卻忘記了將它初始化)。宏可以協助代碼掃描分析器更加容易的實現。除此之外,使用宏的話就更加像是對程式設計語言做的輕微且必要的擴充。

  這樣的話,小編的系統中模組模組的實現代碼最後,往往都會有一個名為init的函數,在裡面僅僅只是簡單的調用了USING來進行引用其他的模組。就比如說下面這個示範例子,具體的程式碼:

  由於大部分的需求下是不需要模組卸載的,所以在這篇教程中小編就不再來論證這一點了。如果大家想要去瞭解的話,可以去查閱相關的書籍。

使用C語言來實現模組化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.