【C语言】【预处理】#if、#ifdef、#ifeq的区别及应用

简介: 【C语言】【预处理】#if、#ifdef、#ifeq的区别及应用

#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


各位读者,可试下前面不同定义宏的方式和后面代码段如何配合使用。


参考资料:



相关文章
|
2天前
|
算法 C语言
深度探索C语言中的do-while语句:理解、应用与性能优化
深度探索C语言中的do-while语句:理解、应用与性能优化
5 1
|
2天前
|
存储 搜索推荐 编译器
C语言数组深入解析与实战应用
C语言数组深入解析与实战应用
4 0
|
2天前
|
Serverless C语言
C语言函数详解与实战应用
C语言函数详解与实战应用
7 1
|
2天前
|
存储 数据处理 C语言
C语言高级应用探讨与实例
C语言高级应用探讨与实例
11 1
|
2天前
|
传感器 网络协议 C语言
C语言在网络编程中的实际应用
C语言在网络编程中的实际应用
10 1
|
2天前
|
算法 Java Unix
C语言:基础、特性与实际应用
C语言:基础、特性与实际应用
11 0
|
2天前
|
C语言
C语言函数调用详解与实战应用
C语言函数调用详解与实战应用
11 2
|
2天前
|
算法 C语言
C语言函数递归调用详解与实战应用
C语言函数递归调用详解与实战应用
10 0
|
2天前
|
存储 算法 C语言
C语言中的结构体与共用体:深入探索与应用
C语言中的结构体与共用体:深入探索与应用
7 0
|
3天前
|
编译器 Linux Shell
外部函数(External Functions)在C语言中的应用
外部函数(External Functions)在C语言中的应用
5 0