【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


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


参考资料:



相关文章
|
4月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
4月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
109 5
|
4月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
4月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
94 1
|
4月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
107 1
|
4月前
|
网络协议 物联网 数据处理
C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势
本文探讨了C语言在网络通信程序实现中的应用,介绍了网络通信的基本概念、C语言的特点及其在网络通信中的优势。文章详细讲解了使用C语言实现网络通信程序的基本步骤,包括TCP和UDP通信程序的实现,并讨论了关键技术、优化方法及未来发展趋势,旨在帮助读者掌握C语言在网络通信中的应用技巧。
97 2
|
4月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。
|
4月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
4月前
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别?
pymalloc 和系统的 malloc 有什么区别?
|
4月前
|
C语言
【c语言】你绝对没见过的预处理技巧
本文介绍了C语言中预处理(预编译)的相关知识和指令,包括预定义符号、`#define`定义常量和宏、宏与函数的对比、`#`和`##`操作符、`#undef`撤销宏定义、条件编译以及头文件的包含方式。通过具体示例详细解释了各指令的使用方法和注意事项,帮助读者更好地理解和应用预处理技术。
70 2