摘要:总结了enum和typedef的含义,以及他们和define的区别。
一、enum是什么
enum是一种自定义类型,其默认的常量在前一个值的基础上加1,如果不给默认的常量赋值,那么第一个常量默认取0,后面依次加1,enum定义的变量,只能取定义时候的离散值。
可以编写程序验证,验证程序如下:
<span style="font-size:18px;">#include <stdio.h>
enum colour
{
green,
red,
blue
};
enum number
{
one,
two=2,
three
};
enum date
{
mon=1,
tues,
thur
};
int main(void)
{
printf("%d\n",green);
printf("%d\n",red);
printf("%d\n",blue);
printf("%d\n",one);
printf("%d\n",two);
printf("%d\n",three);
printf("%d\n",mon);
printf("%d\n",tues);
printf("%d\n",thur);
return0;
}</span>
最终编译运行结果如下:
可以看到,对应的三个enum,打印出来的值,正好就是我们上面解释的enum的意义。前三行,我们没有给enum中的任何常量给值,所以默认输出012;然后我们第二个enum中,只给第二个值一个2,第一个没有给,还是默认0,第三个会在第二个的基础上加1;最后三个输出是我们给第一个常量为1,后面依次加1,所以输出123。另外,如果我们对enum中的常量,取地址,是不对的,因为常量没有地址。
二、枚举类型和define的区别
1.define宏常量只是简单的进行值替换,枚举类型常量是真正意义上的常量。
2.define宏常量无法被调试,枚举类型可以。
3.define宏常量没有类型信息,而枚举类型是特定类型的常量。
要区分它们,首先要清楚编译器如何处理define宏的,比如我们在一个程序的开始定义一个define宏:define LENGTH 15,然后下面我们直接使用LENGTH的时候,就会变成15。编译器在处理的时候,会先进行一个文本上的替换,就是查找程序中的所有的LENGTH,然后依次替换成15,然后再进行编译,所以这是一个简单的值的替换,因为编译的时候已经没有define了,我们自然无法进行调试,同时15这个数字也没有特定的类型信息,像刚才我们定义的colour,number和date都是一个类型。
三、typedef是什么
typedef用于给一个已经存在的数据类型进行重命名,它并不会定义一个新的类型出来,typedef重定义的类型不能是unsigned和signed的扩展。
比如我们使用:typedef int INT32,那么INT32其实就变成了int,我们可以使用它去定义别的变量。
四、typedef和define的区别
typedef是给已有的变量取别名,#define是简单的字符串替换,可以看下面国嵌老师给出的一个例子,很有意思:
typedef char* PCHAR
PCHAR P1,P2;
#define PCHAR char*
PCHAR P3,P4;
这里,最终结果是P1,P2,P3是char型的指针,而P4是一个char型变量,为什么呢,因为在typedef里面,PCHAR是char*的别名,也就是P1,P2同时属于PCHAR类型的变量,就好比我们定义int a,b;用一个类型同时定义多个变量,没有问题。但是define只是简单地字符串变换,在PCHAR P3,P4的时候,替换成了char*P3,P4。所以,P3变成了char型的指针,而P4就是一个char型的变量。
这篇帖子,就总结到这里吧,如有不正确的地方还请指出,大家共同进步。