1.#define const enum
各自特点:
const只是只是给出了对应的内存地址,在代码段,在程序运行过程中值存在一份。
#define给出的是立即数,在只读数据段,在内存中有若干个拷贝,在预编译进行替换
enum: 枚举元素都是常量,它们是有值的,C 语言在编译时按定义的顺序使它
们的值为,1,2,…(可以初始化值,enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat}day;随后的值+1)
相互联系区别:
1.枚举和define都可以swtich,枚举是类型安全的,#define不是类型安全的。枚举只能定义整形值,define能定义几乎任何值
2.#define是在预处理的阶段进行替换工作的,在预编译阶段进行替换,程序运行的过程中宏已不存在了,而且一次只能定义一个。而枚举是在程序运行之后才起作用的,一次可以定义多个数据,枚举常量存储在数据段的静态存储区里,宏占用代码段的空间
3.const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查。而对#define只进行字符替换,没有类型安全检查
4.enum中的数据只能定义为整形,但是const可以定义任意类型。
2.typedef #define的区别:
1>typedef是给一个标识符或者关键字一个别名,不会分配空间,可增加程序的阅读性。是编译过程的一部分。
适用场景: 1.定义变量,下文提到例子 2.struct定义的时候可以方便书写 给一个别名就不用再多写一个struct3.自己定义一个类型 换应用场景时改变typedef就可以一改全改。
2>#define一般用来定义宏,在于处理阶段完成替换,并不在编译阶段。
typedef char* STR1
#define STR2 char *
STR1 a,b => char *a,char *b;
STR2 a,b => char *a, b; => char *a, char b;
定义变量时候不容易发现这种错误,所以在这种时候应该使用typedef 是别名而不是简单的宏替换
3>#define INET32 int
unsigned INET32 i = 10;
typedef int INET32;
unsigned INET32 i = 10;
后者编译出错:typedef去的别名不支持类型扩展