C总结-01

来源:互联网 发布:java获取上月第一天 编辑:程序博客网 时间:2024/06/06 04:37

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去的别名不支持类型扩展

原创粉丝点击