【C语言Tips】对于typedef的一些理解(typedef和define的区别)
背景:
看到校内上的每天学点C语言公共主页发了这样一条状态:typedef char *String_t;和#define String_d char * 这两句在使用上有什么区别?。
然后百度了一下,看到一个比较靠谱的回答。
解释:
简单来说。
1) #define 是预处理指令。 #define的内容在编译预处理时进行简单的替换,不进行正确性检查(但替换后的内容自然编译时会检查正确性,废话)。
2)typedef是在编译时处理的,相当于在作用范围内给某种数据类型的一个外号。但是不能再函数内部使用。
具体实践中的区别:
1 #include<stdio.h> 2 3 #define doublep_1 double* 4 5 typedef double* doublep_2; 6 7 int main() 8 { 9 doublep_1 x1,p1; 10 doublep_2 x2,p2; 11 printf("x1 = %d\tp1 = %d\n",sizeof(x1),sizeof(p1)); 12 printf("x2 = %d\tp2 = %d\n",sizeof(x2),sizeof(p2)); 13 }
第一行显示: x1 = 4 p1 = 8
第二行显示: x2 = 4 p2 = 4
结论:
As we know, double的数据长度是8字节,而指向double的指针是4字节的(32位机器上,任何指针长度都是4字节=32位)。
所以,通过print四个变量的sizeof值可以看出,x1是指针,x2是指针,p2是指针。只有p1是double。
所以,用#define doublep_1 double* 这种方法(实际工作时宏定义最好都用大写),只是简单的在预编译阶段替换掉了doublep_1为double*。集体到这个程序中,也就是把第9行替换成了: double* x1, p1; 显然,这样做只有x1定义成了指针,而p1是double。
而是用typedef是给数据类型起别名,所以第10行处相当于: 定义,有double指针,x,p2。
所以,实际工作中,如果需要给数据类型制定一个别名,最好还是用typedef的方法,以免去#define方法定义多个指针时导致的难以察觉的错误。