【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


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


参考资料:



相关文章
|
20天前
|
存储 算法 C语言
通义灵码在考研C语言和数据结构中的应用实践 1-5
通义灵码在考研C语言和数据结构中的应用实践,体验通义灵码的强大思路。《趣学C语言和数据结构100例》精选了五个经典问题及其解决方案,包括求最大公约数和最小公倍数、统计字符类型、求特殊数列和、计算阶乘和双阶乘、以及求斐波那契数列的前20项和。通过这些实例,帮助读者掌握C语言的基本语法和常用算法,提升编程能力。
|
6天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
1月前
|
编译器 Linux C语言
C语言--预处理详解(3)
【10月更文挑战第3天】
|
2天前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
8天前
|
C语言
【c语言】你绝对没见过的预处理技巧
本文介绍了C语言中预处理(预编译)的相关知识和指令,包括预定义符号、`#define`定义常量和宏、宏与函数的对比、`#`和`##`操作符、`#undef`撤销宏定义、条件编译以及头文件的包含方式。通过具体示例详细解释了各指令的使用方法和注意事项,帮助读者更好地理解和应用预处理技术。
17 2
|
19天前
|
存储 C语言
C语言:普通局部变量、普通全局变量、静态局部变量、静态全局变量的区别
C语言中,普通局部变量在函数内部定义,作用域仅限于该函数;普通全局变量在所有函数外部定义,作用域为整个文件;静态局部变量在函数内部定义但生命周期为整个程序运行期;静态全局变量在所有函数外部定义,但仅在定义它的文件内可见。
34 10
|
30天前
|
存储 C语言
C语言中a 和&a 有什么区别
在C语言中,"a" 是一个变量的名字,代表存储在内存中的某个值。而"&a" 则是获取该变量的内存地址,即变量a在计算机内存中的具体位置。这两者的主要区别在于:"a" 操作的是变量中的值,"&a" 操作的是变量的内存地址。
97 23
|
30天前
|
程序员 编译器 C语言
C中的 malloc 和C++中的 new 有什么区别
在C语言中,`malloc`函数用于在运行时分配内存,返回指向所分配内存的指针,需显式包含头文件 `<stdlib.h>`。而在C++中,`new`不仅分配内存,还对其进行构造初始化,且直接使用类型声明即可,无需额外包含头文件。`new`还支持数组初始化,能更好地融入C++的面向对象特性,而`malloc`仅作为内存分配工具。使用完毕后,`free`和`delete`分别用于释放`malloc`和`new`分配的内存。
49 21
|
17天前
|
存储 C语言
C语言:结构体与共用体的区别
C语言中,结构体(struct)和共用体(union)都用于组合不同类型的数据,但使用方式不同。结构体为每个成员分配独立的内存空间,而共用体的所有成员共享同一段内存,节省空间但需谨慎使用。
|
21天前
|
存储 编译器 C语言
C语言函数的定义与函数的声明的区别
C语言中,函数的定义包含函数的实现,即具体执行的代码块;而函数的声明仅描述函数的名称、返回类型和参数列表,用于告知编译器函数的存在,但不包含实现细节。声明通常放在头文件中,定义则在源文件中。