1.先来看看下面的两段代码有什么区别(注意每一段的第1行代码)
* 第1段
typedef char *String;
intmain(int argc, const char * argv[]) {
String str = "This is a string!";
return 0;
}
* 第2段
#define String char *
int main(int argc, const char * argv[]) {
String str = "This is a string!";
return 0;
}
上面的两段代码只是第1行代码不一样,运行的效果都是一样的:定义了一个字符串"This is a string!"。
但它们的实现方式是不一样的:
• 第1段代码是用typedef给char *定义别名为String
• 第2段代码是用char *代替代码中的宏名String
只看上面两段代码,似乎看不太出typedef和#define的区别。
2.再来看一段代码
typedef char *String1;
#define String2char *
int main(int argc,const char * argv[]) {
String1 str1,str2;
String2 str3,str4;
return 0;
}
第1行给char *起了个别名String1,第2行定义了宏String2。然后在第6、第8行定义了4个变量。
重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。
下面简单分析一下原因:
* 如果连续声明两个int类型的变量,我们可以这样写:
int a, b;
上面的代码相当于:
int a;
int b;
*以此类推
1typedefchar *String1;
2
3String1 str1, str2;
经过typedef处理后,String1也算是一种数据类型,所以第3行代码相当于
1String1 str1;
2String1 str2;
由于String1就是char *,所以上面的两行代码等于
char *str1;
char *str2;
*再看看宏定义的情况
1#defineString2char *
2
3String2 str3, str4;
因为宏定义纯粹是字符串替换,用char *代替String2,所以第3行代码相当于
char * str3,str4;
其实也就相当于:
char * str3;
char str4;
可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。
所以,以后给类型起别名,最好使用typedef,而不是使用#define.