typedef和define区别(条件编译的三种格式)
typedef和define的区别是:define是预处理编辑器,可以定义宏被替换的可能性,typedef由编辑器处理,遵循作用域规则,可以作为定义类型别名
#define是一个c指令,也是定义各种类似typedef的数据类型的别名。但是,两者还是有区别的。接下来我会在文章中详细介绍两者的区别,有一定的参考作用,希望对大家有所帮助
1.预处理器VS编译器
#define由预处理器处理,它将#define值从定义点复制并粘贴到使用点。Typedef由编译器处理,是新类型的实际定义。当控制到达编译器时,所有的#define将被替换。
差异的影响
(1)typedef应以分号结束,而# #define不应以分号结束
(2)在# define中可能有替代的副作用,例如:
typedef char * string _ t; #定义string_d char * string_t s1,S2;// s1和s2都是char *类型 string_d s3,S4;// s3是char *但是s4是char(不是char *)。第二个声明中的问题是预处理器会用
char * s3,S4;这意味着s3属于char *类型,但s4属于char类型。如果希望所有变量都是指针类型,必须指定*
(3)typedef遵循范围规则。也就是说,如果在一个范围内(在一个函数内)定义了一个新类型,那么只有在该范围存在的情况下才会显示新类型的名称。但是,当预处理器遇到#define时,它将替换所有出现的内容(之后没有作用域规则)。例如:
int main (){ { //新范围开始 typedef int Myint _ t; #定义myInt_d int myInt _ t a;//的类型是int myInt _ d b;// b属于int类型 }//新范围结束 myInt _ t c;//错误,找不到输入myInt_t myInt _ d d//d的类型是int }2.宏VS类型别名
#define也可以用来定义宏,但是typedef只能用来为现有类型提供新的名称(它不能创建新的类型)。同样,可以使用# define来定义变量
#define N 10实际上并没有定义N,但是会在整个代码中用10替换N。它可以用来命名常量。Typedef只能为已定义的类型提供新名称
3.typedef用作类型别名
有些类型定义只能由typedef定义,不能由#define定义。示例:
(1)为大小为10的整数数组指定一个新名称
typedef int arr[10];(2)给结构类型起一个新名字
typedef结构{ int a; char b; } myType总结: