四、typedef与枚举类型
使用typedef给枚举类型起别名也可以使代码简洁。
复制代码
1// 定义枚举类型 2enum Season {spring, summer, autumn, winter}; 3// 给枚举类型起别名 4typedefenum Season Season; 5 6int main(int argc, constchar * argv[]) { 7// 定义枚举变量 8Season s = spring; 910return0;11 }
复制代码
在第2行定义了枚举类型,在第4行起了别名为Season,然后在第8行直接使用别名定义枚举变量,不用再带上enum关键字了。
第1行~第4行代码可以简化为:
// 定义枚举类型,并且起别名typedefenum Season {spring, summer, autumn, winter} Season
甚至可以省略枚举名称,简化为:
typedefenum {spring, summer, autumn, winter} Season;
回到顶部
五、typedef与指向函数的指针
1.先来回顾下函数指针的知识
复制代码
1 #include 2 3 // 定义一个sum函数,计算a跟b的和 4 int sum( int a, int b) { 5 int c = a + b; 6 printf( " %d + %d = %d " , a, b, c); 7 return c; 8 } 9 10 int main( int argc, const char * argv[]) { 11 // 定义一个指向sum函数的指针变量p 12 int (*p)( int, int) = sum; 13 14 // 利用指针变量p调用sum函数 15 (*p)( 4, 5 ); 16 17 return 0 ; 18 }
复制代码
* 在第4行定义了一个sum函数,第12行定义了一个指向sum函数的指针变量p,可以发现,这个指针变量p的定义比一般的指针变量看来复杂多了,不利于理解。
* 第15行调用了p指向的sum函数,输出结果:
2.为了简化代码和方便理解,我们可以使用typedef给指向函数的指针类型起别名
复制代码
1 #include 2 3 // 定义一个sum函数,计算a跟b的和 4 int sum( int a, int b) { 5 int c = a + b; 6 printf( " %d + %d = %d " , a, b, c); 7 return c; 8 } 9 10 typedef int (* MySum)( int, int ); 11 12 int main( int argc, const char * argv[]) { 13 // 定义一个指向sum函数的指针变量p 14 MySum p = sum; 15 16 // 利用指针变量p调用sum函数 17 (*p)( 4, 5 ); 18 19 return 0 ; 20 }
复制代码
* 看第10行,意思是:给指向函数的指针类型,起了个别名叫MySum,被指向的函数接收2个int类型的参数,返回值为int类型。
* 在第14行直接用别名MySum定义一个指向sum函数的指针变量p,这样看起来简单舒服多了。第17行的函数调用是一样的。
回到顶部
六、typedef与#define
1.先来看看下面的两段代码有什么区别(注意每一段的第1行代码)
* 第1段
复制代码
1typedefchar *String;23int main(int argc, constchar * argv[]) {4String str = "This is a string!";5return0;6 }
复制代码
* 第2段
复制代码
1#defineStringchar *23int main(int argc, constchar * argv[]) {4String str = "This is a string!";5return0;6 }
复制代码
上面的两段代码只是第1行代码不一样,运行的效果都是一样的:定义了一个字符串"This is a string!"。
但它们的实现方式是不一样的:
第1段代码是用typedef给char *定义别名为String
第2段代码是用char *代替代码中的宏名String
只看上面两段代码,似乎看不太出typedef和#define的区别。
2.再来看一段代码
复制代码
1typedefchar *String1; 2 3#defineString2char * 4 5int main(int argc, constchar * argv[]) { 6String1 str1, str2; 7 8 String2 str3, str4; 9return0;10 }
复制代码
第1行给char *起了个别名String1,第2行定义了宏String2。然后在第6、第8行定义了4个变量。
重点来了,注意:在这种情况下,只有str1、str2、str3才是指向char类型的指针变量,str4只是个char类型的变量。
下面简单分析一下原因:
* 如果连续声明两个int类型的变量,我们可以这样写:
int a, b;
上面的代码相当于:
int a;int b;
* 以此类推
1typedefchar *String1;23String1 str1, str2;
经过typedef处理后,String1也算是一种数据类型,所以第3行代码相当于
1String1 str1;2String1 str2;
由于String1就是char *,所以上面的两行代码等于
char *str1;char *str2;
* 再看看宏定义的情况
1#defineString2char *23String2 str3, str4;
因为宏定义纯粹是字符串替换,用char *代替String2,所以第3行代码相当于
char * str3, str4;
其实也就相当于:
char * str3;char str4;
可以看出,只有str4是基本数据类型,str1、str2、str3都是指针类型。
所以,以后给类型起别名,最好使用typedef,而不是使用#define |
|