先来说结论:
1.宏定义作用于编译之前(也就是预编译阶段,而typedef作用于编译阶段
2.typedef仅限于类型的重定义,而宏定义不仅可以为类型起别名还可以为数值定义起别名(简单的替换)
下面来看一下区别
下面这是typedef的用法
typedef int* PINT;
int main()
{
int a = 10, b = 20;
const PINT p = &a;
*p = 100;
p = &b;
}
我们会看到p = &b这行代码会报错:“表达式必须是可修改的左值”,为什么会这样呢,原因是PINT等价于int* 但是使用typedef的话,int*在编译阶段是个整体,也就是说const修饰的是int*这个整体,而我们知道int*这个整体是个指针类型,也就是指针显常性,就是我们的p显示为常性(因为我们的p是个指针,const修饰的是指针),无法修饰到指向为常性,所以我们可以修改到它的指向,而*p指向不为常性,本身我们*p = 10,所以我们可以对*p进行修改
const PINT p = &a;
所以显示为常性的是p
下面来看宏定义:
#define SINT int*
int main()
{
int a = 10, b = 20;
const SINT p = &a;
*p = 100;
p = &b;
}
我们会看到*p = 100;这句代码会报错:“表达式必须是可修改的左值”,原因是我们在的宏定义在预编译阶段就已经被替换掉了,也就是一直都是const int * p = &a;const修饰的一直都是*这个指向,所以我们的指向不可改变,因此我们的*p = 100会报错,而我们的指针本身p在上述代码中不具备常性,所以p = &b代码可以通过
关于typedef和宏定义的区别我的理解如上文章所示,有错误的地方还请大家指出,共同学习,共同进步!