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是给类型起别名,和原类型功能一样。