巨集開關管理模組的實現 C語言
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
- 作者:鄒祁峰
- 郵箱:[email protected]
- 部落格:http://blog.csdn.net/qifengzou
- 日期:2012.11.11
- 轉載請註明來自"
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