[置顶] 宏开关管理模块的实现[C语言]

  • 作者:邹祁峰
  • 邮箱:[email protected]
  • 博客:http://blog.csdn.net/qifengzou
  • 日期:2012.11.11
  • 转载请注明来自"祁峰"的CSDN博客

1 优点

  一个完整的软件系统往往不止1个模块或功能,而且各模块或功能又有各种版本的实现,为了便于对各模块和功能的管理,在此引入宏开关的概念.宏开关是控制某模块代码或功能的宏,通过宏开关值的修改,可以控制软件系统模块的开启或关闭,或者行为或样式的改变.在使用中可发现,宏开关往往有如下几个优点:

->1 便于移植

  在移植过程中,可根据功能宏快速的将功能模块代码进行提取和分离。

->2 增强扩展

  可通过宏的开启和关闭来控制此功能开启和关闭,增强了平台的可配置性、可扩展性。

->3 加速问题定位

  在软件的运行或测试过程中,往往会出现各种问题,如果怀疑某一模块有问题,可将此功能模块关闭,如果问题消失,则说明问题就在此模块,否则可排除此模块。

->4 提高开发效率

  如果未使用功能宏控制时,如果不要此功能时,则需要对代码进行修改、删除等操作,但之后有需要此功能时,又得重新去修改、增加相应的代码。而一旦有功能宏控制,只需将对应的宏开启或关闭就能达到想要的目的,而不用对代码进行任何的修改。


2 实现

  随着平台功能的增加,宏开关的数量也随之递增,如果不对宏开关进行统一的管理,将可能造成模块维护的混乱,致使成本也相应的增加.针对此问题的存在,在此提出了宏开关管理模块,实现对宏开关有效的管理.目前通常有2种方法实现宏开关管理模块:

2.1 Makefile实现

->1. 开关设置

// filename: mars_switch.mak
DEBUG_SUPPORT = TRUE

OS_TYPE = AIX

代码1 开关设置

->2. 加载功能宏

// filename: mars_option.mak
ifeq(TRUE, $(strip $(DEBUG_SUPPORT))
    OPTIONS += __DEBUG__
endif

ifeq(LINUX, $(strip $(OS_TYPE))
    OPTIONS += __LINUX__
else
    ifeq(AIX, $(strip $(OS_TYPE))
        OPTIONS += __AIX__
    else
        ifeq(UNIX, $(strip $(OS_TYPE))
            OPTIONS += __UNIX__
        endif
    endif
endif
代码2 加载宏

->3. 加入编译

// filename: Makefile
CFLAGS += $(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


你可能感兴趣的:([置顶] 宏开关管理模块的实现[C语言])