define define是预处理指令,在编译时不进行任何检查,只进行简单的替换 宏定义的一般形式为:define宏名字符串 这里所说的字符串是一般意义上的字符序列,不要和C语言中的字符串等同,它不需要双引号。typedef typedef是在C语言中用来为复杂的声明定义简单的别名,它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。 typedef取别名的一般形式为:typedef旧名字新名字define与typedef的区别 (1)define之后不带分号,typedef之后带分号。 (2)define可以使用其他类型说明符对宏类型名进行扩展,而typedef不能这样做。如:defineINT1intunsignedINT1n;没问题typedefintINT2;unsignedINT2n;有问题 INT1可以使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。 (3)在连续定义几个变量的时候,typedef能够保证定义的所有变量均为同一类型,而define则无法保证。如:definePINT1PINT1p1,p2;即intp1,p2;typedetintPINT2;PINT2p1,p2;p1、p2类型相同 PINT1定义的p1与p2类型不同,即p1为指向整形的指针变量,p2为整形变量;PINT2定义的p1与p2类型相同,即都是指向int类型的指针。 下面看一个关于typedef的重要的问题。请看代码:includestdio。htypedefcharpSintmain(void){charstring〔4〕第一行代码constcharp1第二行代码constpStrp2第三行代码p1;第四行代码p2;第五行代码return0;} 这段代码编译会报一个错误:error:incrementofreadonlyvariablep2,你知道问题出在哪吗? 答案与解析: 是第五行代码p2出错了。这个问题提醒我们:typedef和define不同,它不是简单的文本替换。上述代码中constpStrp2并不等于constcharp2。constpStrp2和pStrconstp2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。 因此,constpStrp2的含义是:限定数据类型为char的变量p2为只读,即为charconstp2,表明p2是一个指向char类型的常指针,所以p2是不可修改的,因此p2错误。 顺便提一下关于const声明的一些例子及其含义: a是常数,不可改变; b是常数,不可改变; c是一个指向整型常数的指针,指针可以变,指针指向的内容不可以变; d是一个指向整型变量的常指针,指针不可以变,指针指向的内容可以变; e是一个指向整型常数的常指针,指针与指针指向的内容都不可变。 往期好文: 实用分享几个非常实用的开源项目 分享一个有趣的库,让你学习C语言不会觉得那么枯燥 分享GitHub上一位老外的嵌入式C编码规范(收藏细读) 我整理了一个嵌入式资料库,大家有什么好资料分享?可以给我留言,我把它加进去,资源共享,一起来完善这个资料库! (资料库链接: https:gitee。comzhengnianliEmbedSummary)