使用C语言来实现模块化
除了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來進行引用其他的模塊。就比如說下面這個示范例子,具體的程序代碼如圖所示:
由于大部分的需求下是不需要模塊卸載的,所以在這篇教程中小編就不再來論證這一點了。如果大家想要去了解的話,可以去查閱相關的書籍。
轉載于:https://www.cnblogs.com/zyjj/p/7151717.html
總結
以上是生活随笔為你收集整理的使用C语言来实现模块化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Qt选择文件对话框-中文路径-转std:
- 下一篇: 【模拟】【贪心】POJ2709Paint