define完全可以理解替换,typedef代表别名。听着差不多的意思,那2者区别在哪?
先来个简单例子查看基本使用。
//define和typedef区别 #define DB double //替换 define 被替换的内容 替换的内容 typedef double db; //别名 typedef 原来的类型名 新的别名 //typedef需要分号 ,typeof 去掉以后符合语法规则,define去掉就会报错 void main() { //看不出区别 DB d1 = 1.2,d2=1.8; //等价 double d1 = 1.2,d2=1.8; db d3 = 1.9,d4=2.3; //等价 double d3 = 1.9,d4=2.3; printf("%f,%f",d1,d2); printf("\n%f,%f",d3,d4); }
上面唯一看出的区别就是typedef需要分号。
通过指针变量来测试2者的区别
#define DP double * typedef double * dp; void main2() { DP dp1,dp2; //DP是替换,等价 double *dp1,dp2; //dp1是指针占4个字节,dp2就是double类型数据8字节 dp dp3,dp4; //都是4字节的指针, 等价于 dobule *dp3,*dp4; printf("%d,%d", sizeof(dp1),sizeof(dp2)); //4,8 printf("\n%d,%d",sizeof(dp1),sizeof(dp2)); //4,4 }
通过上面例子可以看出define完全就是替换,typedef则不同。
最后简单说明下,利用利用define和typedef构建函数指针
1 void print(int num) 2 { 3 printf("时间%d",num); 4 } 5 6 void main() 7 { 8 //函数指针 9 void(*p)(int num) = print; 10 p(10); 11 }
但是像上面第9行代码那样写多了会觉得很烦啊,可以使用define和typedef来构建
1 //typedef int* pint; //给int类型指针别名 2 typedef void(*p)(int num); //给函数指针类型别名 ,p是类型的别名 3 #define Pprint(X) void(*X)(int num) //带参数的宏模式 4 5 void main() 6 { 7 //函数指针 8 9 //利用typedef 10 p p1 = print; 11 p1(10); 12 13 //利用define 14 Pprint(p2) = print; 15 p2(33); 16 }