宏定义是c语言提供的三种预处理功能之一,包含宏定义、文件包含、条件编译。
宏定义和操作符的区别:宏的定义是置换,既不计算也不求解公式。 宏的定义也称为宏置换、宏置换,简称“宏”。 在c语言中,宏是生成嵌入代码的唯一方法。 在嵌入式系统中,宏是一种很好的代替函数的方法来满足性能要求。
宏定义的格式:#DEFINE标识符字符串
掌握"宏观"概念的关键是"交换"。 一切都是以交换为前提,做什么之前必须交换。 在正确理解之前必须“交换”。 这意味着,在具体分析相关命令或句子的含义或功能之前,必须进行交换。
定义宏需要注意以下几点:
)1)宏名称一般使用大写字母
)2)使用宏可以提高程序的通用性和可读性,减少不一致性,减少输入错误,便于修改。 例如,数组大小的一般宏定义;
)3)预处理是编译前的处理,但是编译工作的任务之一是语法检查,预处理不进行语法检查。
)4)宏观定义末尾的不加分
(5)宏定义写在函数大括号外,作用域为后续程序,通常位于文件开头;
(6)可以使用#undef命令终止宏定义的范围;
(7)宏观定义允许嵌套
(8)字符串)“)中绝对不包含宏;
(9)宏定义不分配内存,变量定义分配内存;
(10 )宏的定义没有类型问题,其参数也是无类型的。
在c语言/c类区域设置中,宏的作用如下:
1.取代Magic Number
这个作用在嵌入式开发时太重要了。 如果SoC 50多页的datasheet、上百个寄存器的位操作、语义宏的定义不清晰,查步骤查手册绝对是崩溃的节奏!
2.防止重复定义
#ifndef XXXX
#define XXXX
#endif
3.快速控制代码编译
#define SIMULATION_DEBUG 1
#if SIMULATION_DEBUG
使用精简数据
#else
实时数据
#endif
4.编译系统控制链
某些系统可以将宏定义传递给编译器,并通过编译脚本(makefile )控制编译选项。 例如,可以结合上述代码在makefile中定义。
cdefines=$(cdefines )/SIMULATION_DEBUG
说到编译,还应该提到ANSI C中预定义的几个非常有用的编译宏。
• _ L I N E _
• _ F I L E _
• _ D A T E _
• _ T I M E _
• _ S T D C _
例如
#definedebugmsg(msg,date ) printf ) msg;
printf(「%d%d%d”,date,_LINE_,_FILE_ )
5.使用typedef
C语言中的typedef也是宏的定义。 c语言中的struct typedef函数指针会告诉你可以进行面向对象的继承、重载和多态性吗? (如果你感兴趣的话,可以看看MFC的源代码实现,把传统的C风格的Windows API进行各种包装装饰、包装。 )
typedefint(*pffunc1) ) int;
6.简化操作
得到一个字的高位字节和低位字节
#defineword_lo(xxx ) (byte ) ) word ) XXX ) 255 ) )
#defineword_hi(xxx ) ) byte ) ) word ) XXX )8) )