define是预处理指令,在编译时不进行任何检查,只进行简单的替换git
宏定义的通常形式为:github
#define 宏名 字符串
这里所说的字符串是通常意义上的字符序列,不要和C语言中的字符串等同,它不须要双引号。微信
typedef是在C语言中用来为复杂的声明定义简单的别名,它自己是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出如今同一个表达式中。指针
typedef取别名的通常形式为:code
typedef 旧名字 新名字
(1)#define以后不带分号,typedef以后带分号。rem
(2)#define可使用其余类型说明符对宏类型名进行扩展,而 typedef 不能这样作。如:字符串
#define INT1 int unsigned INT1 n; //没问题 typedef int INT2; unsigned INT2 n; //有问题
INT1可使用类型说明符unsigned进行扩展,而INT2不能使用unsigned进行扩展。get
(3)在连续定义几个变量的时候,typedef 可以保证定义的全部变量均为同一类型,而 #define 则没法保证。如:博客
#define PINT1 int*; P_INT1 p1,p2; //即int *p1,p2; typedet int* PINT2; P_INT2 p1,p2; //p一、p2 类型相同
PINT1定义的p1与p2类型不一样,即p1为指向整形的指针变量,p2为整形变量;PINT2定义的p1与p2类型相同,即都是指向 int 类型的指针。string
下面看一个关于typedef的重要的问题!!请看代码:
#include <stdio.h> typedef char *pStr; int main(void) { char string[4]="abc"; //第一行代码 const char *p1=string; //第二行代码 const pStr p2 = string; //第三行代码 p1++; //第四行代码 p2++; //第五行代码 return 0; }
这段代码编译会报一个错误:error: increment of read-only variable 'p2'
,你知道问题出在哪吗?
答案与解析:
是第五行代码p2++出错了。这个问题提醒咱们:typedef和#define不一样,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和pStr const p2本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是咱们本身定义的而不是系统固有类型而已。
所以,const pStr p2的含义是:限定数据类型为char 的变量p2为只读,即为char const p2,代表p2是一个指向char类型的常指针,因此p2是不可修改的,所以p2++错误。
顺便提一下关于const声明的一些例子及其含义:
const int a; //① int const b; //② const int *c; //③ int * const d; //④ int const * e const; //⑤
①a是常数,不可改变;
②b是常数,不可改变;
③c是一个指向整型常数的指针,指针能够变,指针指向的内容不能够变;
④d是一个指向整型变量的常指针,指针不能够变,指针指向的内容能够变;
⑤e是一个指向整型常数的常指针,指针与指针指向的内容都不可变。
个人我的博客:https://zhengnianli.github.io/
个人微信公众号:嵌入式大杂烩