typedef与#define的区别

typedef与#define

1.先来看看下面的两段代码有什么区别(注意每一段的第1行代码)

* 第1段

复制代码
1 typedef char *String;
2 
3 int main(int argc, const char * argv[]) {
4     String str = "This is a string!";
5     return 0;
6 }
复制代码

* 第2段

复制代码
1 #define String char *
2 
3 int main(int argc, const char * argv[]) {
4     String str = "This is a string!";
5     return 0;
6 }
复制代码

上面的两段代码只是第1行代码不一样,运行的效果都是一样的:定义了一个字符串"This is a string!"。

但它们的实现方式是不一样的:

  • 第1段代码是用typedef给char *定义别名为String
  • 第2段代码是用char *代替代码中的宏名String

只看上面两段代码,似乎看不太出typedef和#define的区别。

 

2.再来看一段代码

复制代码
 1 typedef char *String1;
 2 
 3 #define String2 char *
 4 
 5 int main(int argc, const char * argv[]) {
 6     String1 str1, str2;
 7     
 8     String2 str3, str4;
 9     return 0;
10 }
复制代码

第1行给char *起了个别名String1,第2行定义了宏String2。然后在第6、第8行定义了4个变量。

重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。

 

下面简单分析一下原因:

* 如果连续声明两个int类型的变量,我们可以这样写:

int a, b;

上面的代码相当于:

int a;
int b;

* 以此类推

1 typedef char *String1;
2     
3 String1 str1, str2;

经过typedef处理后,String1也算是一种数据类型,所以第3行代码相当于

1 String1 str1;
2 String1 str2;

由于String1就是char *,所以上面的两行代码等于

char *str1;
char *str2;

 

* 再看看宏定义的情况

1 #define String2 char *
2 
3 String2 str3, str4;

因为宏定义纯粹是字符串替换,用char *代替String2,所以第3行代码相当于

char * str3, str4;

其实也就相当于:

char * str3;
char str4;

可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。

所以,以后给类型起别名,最好使用typedef,而不是使用#define。

总结:#define宏定义纯粹是字符串替换,而typede是给类型起别名,和原类型功能一样。

 

posted @ 2016-05-20 10:18  stevenwuzheng  阅读(260)  评论(0编辑  收藏  举报