场景

开发中经常需要根据一些配置使用不同的代码块,比如根据配置决定是否用不同的代码实现某个接口,或者根据配置决定在内核态或者用户态使用不同的接口。

Makefile中定义

CFLAGS = \
	-DCFG_XXX_TYPE=1

注意这里不能定义成字符串比如 CFG_XXX_TYPE=“abc” 然后C语言中进行 CFG_XXX_TYPE == “CFG_XXX_TYPE”

C语言中使用

#if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)
    #define SET_DFT_LEN 10
    int a = 1;
#else
    #define SET_DFT_LEN 20
    int a = 2;
#endif

注意 试用了 defined以及配置 && 进行 ==比较
如果多个就添加

#else if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 2)

常用场景

  • 同一个函数有2种实现,根据配置决定是否用模拟代码
#if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)
    int func1(void) {
    printf("this is a stub\n");
    return 0;
    }
#else
    int func1(void) {
    return hardware_read();
    }
#endif
  • 或者根据配置决定在内核态或者用户态使用不同的接口
#if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)
    kthread_create(xxx);
#else
    pthread_create(xxx);
#endif
  • 包含不同的头文件等
#if defined(CFG_XXX_TYPE) && (CFG_XXX_TYPE == 1)
    #include "kernel.h"
#else
    #include "userspace.h"
#endif

…

更多推荐