#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
各位读者,可试下前面不同定义宏的方式和后面代码段如何配合使用。
参考资料:
- #ifdef and #ifndef Directives (C/C++)
- The C Preprocessor
如本文对你有些许帮助,欢迎大佬打赏:
支付宝打赏方式及我的购物小店