1. 程式人生 > >巨集開關管理模組的實現 C語言

巨集開關管理模組的實現 C語言

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

               


1 優點

  一個完整的軟體系統往往不止1個模組或功能,而且各模組或功能又有各種版本的實現,為了便於對各模組和功能的管理,在此引入巨集開關的概念.巨集開關是控制某模組程式碼或功能的巨集,通過巨集開關值的修改,可以控制軟體系統模組的開啟或關閉,或者行為或樣式的改變.在使用中可發現,巨集開關往往有如下幾個優點:

->1 便於移植

  在移植過程中,可根據功能巨集快速的將功能模組程式碼進行提取和分離。

->2 增強擴充套件

  可通過巨集的開啟和關閉來控制此功能開啟和關閉,增強了平臺的可配置性、可擴充套件性。

->3 加速問題定位

  在軟體的執行或測試過程中,往往會出現各種問題,如果懷疑某一模組有問題,可將此功能模組關閉,如果問題消失,則說明問題就在此模組,否則可排除此模組。

->4 提高開發效率

  如果未使用功能巨集控制時,如果不要此功能時,則需要對程式碼進行修改、刪除等操作,但之後有需要此功能時,又得重新去修改、增加相應的程式碼。而一旦有功能巨集控制,只需將對應的巨集開啟或關閉就能達到想要的目的,而不用對程式碼進行任何的修改。


2 實現

  隨著平臺功能的增加,巨集開關的數量也隨之遞增,如果不對巨集開關進行統一的管理,將可能造成模組維護的混亂,致使成本也相應的增加.針對此問題的存在,在此提出了巨集開關管理模組,實現對巨集開關有效的管理.目前通常有2種方法實現巨集開關管理模組:

2.1 Makefile實現

->1. 開關設定

// filename: mars_switch.makDEBUG_SUPPORT = TRUEOS_TYPE = AIX

程式碼1 開關設定

->2. 載入功能巨集

// filename: mars_option.makifeq(TRUE, $(strip $(DEBUG_SUPPORT))    OPTIONS += __DEBUG__endififeq(LINUX, $(strip $(OS_TYPE))    OPTIONS += __LINUX__else    ifeq(AIX, $(strip $(OS_TYPE))        OPTIONS += __AIX__    else        ifeq(UNIX, $(strip $(OS_TYPE))            OPTIONS += __UNIX__        endif    endifendif
程式碼2 載入巨集
->3. 加入編譯

// filename: MakefileCFLAGS += $(patsubst %, -D%, $(OPTIONS))
程式碼3 加入編譯 ->4. 功能巨集的使用
int main(int argc, const char *argv[]){#if defined(__LINUX__)    fprintf(stdout, "OS is linux!");#elif defined(__AIX__)    fprintf(stdout, "OS is aix!");#elif defined(__UNIX__)    fprintf(stdout, "OS is unix!");#endif /*__LINUX__*/}

程式碼4 功能巨集的使用

2.2 標頭檔案實現

->1. 開關值定義

// filename: mars_type.h#define __ON__            (-1)#define __OFF__           (-2)#define __AUTO__          (-3)#define LINUX             (-1)#define AIX               (-2)#define UNIX              (-3)
程式碼5 開關值定義 ->2. 開關設定
// mars_switch.h#define CFG_DEBUG_SUPPORT  (__ON__)#define CFG_OS_TYPE        (LINUX)
程式碼6 開關設定 ->3. 定義功能巨集
// filename: mars_features.h#if defined(CFG_DEBUG_SUPPORT) && (__ON__ == CFG_DEBUG_SUPPORT)    #define __DEBUG__#endif#if defined(CFG_OS_TYPE) && (LINUX == CFG_OS_TYPE)    #define __LINUX__#elif defined(CFG_OS_TYPE) && (AIX == CFG_OS_TYPE)    #define __AIX__#elif defined(CFG_OS_TYPE) && (UNIX == CFG_OS_TYPE)    #define __UNIX__#endif /*CFG_OS_TYPE*/

程式碼7 定義功能巨集

->4. 功能巨集的使用

int main(int argc, const char *argv[]){#if defined(__LINUX__)    fprintf(stdout, "OS is linux!");#elif defined(__AIX__)    fprintf(stdout, "OS is aix!");#elif defined(__UNIX__)    fprintf(stdout, "OS is unix!");#endif /*__LINUX__*/}

程式碼8 功能巨集的使用

3 巨集開關使用

    通過以上方法的組織,便可輕鬆決定某個功能的開啟和關閉。例如:

    ① 關閉__DEBUG__

        ->1. 如果是使用Makefile方式實現,則只需將DEBUG_SUPPORT = FALSE

        ->2. 如果是使用標頭檔案方式實現,則只需將CFG_DEBUG_SUPPORT = __OFF__

    ② 開啟__UNIX__

        ->1. 如果是使用Makefile方式實現的巨集開關,則只需將OS_TYPE = UNIX

        ->2. 如果是使用標頭檔案方式實現的巨集開關,則只需將CFG_OS_TYPE = UNIX


           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述