【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方法定义多个指针时导致的难以察觉的错误。

 

 

posted on 2012-10-15 20:30  陆大侠  阅读(240)  评论(0编辑  收藏  举报

导航