#if和#ifdef的区别与联系
- 比较容易混淆的是#if和#ifdef,可参考下微软网站的解释:
- You can use the #ifdef and #ifndef directives anywhere #if can be used.
- The #ifdef identifier statement is equivalent to #if 1 when identifier has been defined. It’s equivalent to #if 0 when identifier
- hasn’t been defined, or has been undefined by the #undef directive.
- 二者区别可参考下面表格:
#if | #ifdef |
后面跟“整型常量表达式” | 后面跟一个宏名 |
判断后面的表达式的值(是否为非0值) | 判断后面的标识符有没有定义 |
后面值为非0,结果为true | 后面的标识符定义过,结果为true |
配合#elif、#else使用 | 配合#else使用 |
可支持多条件,如配合defined使用 | 仅可支持 一个条件 |
- 二者的联系:
> #ifdef XXX = #if defined(XXX) > #ifndef XXX = #if !defined(XXX)
#ifeq的用法
- 常见用法:
ifeq ($(X_MODULE_DEBUG_ENABLE),1) ifeq ($(X_MODULE_DEBUG_ENABLE),y)
- 一般用于判断后面判断后面两个参数是否相等,相等为 true,不相等则为 false;
- 格式与#if、#ifdef不同,所以不容易混淆;
一个例子
- C语言.c或.h文件中定义宏:
#define X_MODULE_DEBUG_ENABLE #define X_MODULE_DEBUG_ENABLE=y #define X_MODULE_DEBUG_ENABLE=1 #define X_MODULE_DEBUG_ENABLE=0
- makefie中定义宏:
- export X_MODULE_DEBUG_ENABLE=y - export X_MODULE_DEBUG_ENABLE=1 - export X_MODULE_DEBUG_ENABLE=0 - -DX_MODULE_DEBUG_ENABLE=y - -DX_MODULE_DEBUG_ENABLE=1 - -DX_MODULE_DEBUG_ENABLE=0
- 一个预处理指令应用的代码段
#if X_MODULE_DEBUG_ENABLE //X_MODULE_DEBUG_ENABLE为非0值,为TRUE //#ifeq(X_MODULE_DEBUG_ENABLE,1) //X_MODULE_DEBUG_ENABLE=1,为TRUE //#ifeq(X_MODULE_DEBUG_ENABLE,y) //X_MODULE_DEBUG_ENABLE=y,为TRUE //#ifdef X_MODULE_DEBUG_ENABLE //X_MODULE_DEBUG_ENABLE定义了,为TRUE #define LOG_TAG "[ES7243]: %s() line: %d " #define X_MODULE_Log(fmt, args...) printk(KERN_INFO LOG_TAG fmt, __FUNCTION__, __LINE__, ##args) #else #define X_MODULE_Log(fmt, args...) #endif
各位读者,可试下前面不同定义宏的方式和后面代码段如何配合使用。