中define函数定义一个常量。常量类似变量,不同之处在于:在设定以后,常量的值无法更改。常量名不需要开头的
通过定义和取消定义该宏定义,即可实现该功能是否启用,在项目前期调试过程中,会经常用到。量产交付时,应尽可能减少该类宏定义。
我们调用Spi_SyncTransmit_Abstract(One);时,最终发送的就是TEST_One_SpiSequence当调用Spi_SyncTransmit_Abstract(Two);时,发送的就是TEST_Two_SpiSequence
当我们想用一个宏定义来控制一段代码是否参与编译,也可以说一个功能是否启用(功能对应的代码都加上了对应的宏定义)可以使用宏开关的方式实现示例如下:我们定义一个
。还有一种用法,可以改变输入的参数,实现不同的定义输入:例如,我们在MCAL中定义了两个Sequence,一个TEST_One_SpiSequence,一个TEST_Two_SpiSequence,通过如下宏定义:
第二部分为宏(macro),一般为缩略语,其名称(宏名)一般大写,而且不能有空格,遵循C变量命令规则。“替换文本”可以是任意常数、表达式、字符串等。
因为INT1a1,b1;被宏代换后为:int*a1,b1;即定义的是一个指向int型变量的指针a1和一个int型的变量b1.而INT2a2,b2;表示定义的是两个变量a2和b2,这两个变量的类型都是INT2的,也就是int*的,所以两个都是指向int型变量的指针。
#defineM5//宏定义#definePI3.14//宏定义inta[M];//会被替换为:inta[5];intb=M;//会被替换为:intb=5;printf("PI=%.2f\n",PI);//输出结果为:PI=3.14
所以两者区别在于,宏定义只是简单的字符串代换,在预处理阶段完成。而typede不是简单的字符串代换,而是可以用来做类型说明符的重命名的,类型的别名可以具有类型定义说明的功能,在编译阶段完成的。
在预处理工作过程中,代码中所有出现的“宏名”,都会被“替换文本”替换。这个替换的过程被称为“宏代换”或“宏展开”(macroexpansion)。“宏代换”是由预处理程序自动完成的。在C语言中,“宏”分为两种:
这些简单的宏主要被用来定义那些显式常量,而且会使得程序更加容易修改,特别是某一常量的值在程序中多次被用到的时候,只需要改动一个宏定义,则程序中所有出现该变量的值都可以被改变。而且宏定义还有更多其他优点,如使得程序更容易理解,可以控制条件编译等。
再强调下,宏进行简单的文本替换,无论替换文本中是常数、表达式或者字符串等,预处理程序都不做任何检查,如果出现错误,只能是被宏代换之后的程序在编译阶段发现。
宏代换的过程在上句已经结束,实际的5*5相乘过程则在编译阶段完成,而不是在预处理器工作阶段完成,所以
而且,宏在单片机代码中用的很多,常数的替换、地址的偏移,等等都用得上用宏来修改移植代码更加便捷,代码更容易使人读懂。。。。
define是C语言中的一个预处理指令,其中的“#”表示这是一条预处理命令·。凡是以“#”开头的均为预处理命令,“define”为宏定义命令,“标识符”为所定义的宏名。
标签: #语言 #用法 #定义 #def #规则
免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:goldenhorseconnect@gmail.com