#define宏和枚举
- #define宏常量是在预编译阶段进行简单替换,枚举常量则是在编译的时候确定其值。
- 一般在调试器里面,可以调试枚举常量,但是不能调试宏常量
- 枚举可以一次定义大量相关的常量,但是#define宏一次只能定义一个
#define宏和typedef关键字
typedef的含义是给一个已知的数据类型取一个别名,实际上变量类型没有发生变化。
typedef struct student{
// some data
}stu_st, *stu_pst;
struct student stu1;
stu_st stu2;
struct student *stu3;
stu_st* stu4;
stu_pst stu5;
以上代码中,stu1和stu2的含义没有区别,stu3,stu4,stu5的含义没有区别。
变量声明对unsigned的扩展支持
以宏的方式定义数据类型
#define INT32 int
typedef int int32
以上两种方式编译器都支持,可以理解为将int数据类型取一个int32的别名,但是#define宏是在预编译的时候进行简单替换,但是typedef类型是以一个真正数据类型存在。
unsigned INT32 index_define = 0; // #define宏定义的大写INT32
unsigned int32 index_typedef = 0; // typedef定义的小写int32
如上对变量的声明,编译器在编译变量index_typedef 时会报错,而变量index_define 则可以顺利编译通过,这是因为#define宏是进行的一次简单替换,替换后的结果符合编译器编译规则,而typedef命名出的数据类型不支持这种unsigned的扩展。
指针变量声明的区别
#define PINT int*
typedef int* pint
PINT p1,P2;
pint p3,p4;
以上代码声明的变量,其中p1,p3,p4表示int类型的指针变量,p2表示int类型数据。