网站推广.NET

网站推广.NET

C语言中typedef和define有什么区别

来源:互联网

typedef和define的区别有:define是预处理编辑器,可定义宏存在被替换的的可能性而typedef是由编辑器处理的,并且遵循范围规则,可用作定义类型别名

#define是一个C指令,它也是用于定义类似于typedef的各种数据类型的别名。但是它们之间仍存在差别,接下来在文章中具体为大家介绍它们之间的区别,具有一定的参考作用,希望对大家有所帮助

【推荐课程:C语言教程】

1、预处理器VS编译器

立即学习“C语言免费学习笔记(深入)”;

#define由预处理器处理的,它将#define值从定义点复制粘贴到使用点。而typedef是由编译器处理的,并且是新类型的实际定义。在控制将到达编译器时,所有#define都将被替换。

差异的影响

(1)typedef要以分号结束而#define不以分号结束

(2)#define中可能存在替换的副作用,例如:

   typedef char * string_t;            #define 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;                  #define myInt_d int                 myInt_t a;  // 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,但是会在整个代码中将N替换为10。所以可以用于命名常量。而typedef只能为已定义的类型提供新名称

3、将typedef作为类型别名

某些类型定义只能使用typedef定义,而不能使用#define定义。例:

(1)给大小为10的整数数组赋一个新名称

       typedef int arr [ 10 ] ;

(2)为结构类型赋予新名称

typedef struct {           int a;            char b;        } myType;

总结:以上就是本篇文章的全部内容了,希望对大家有所帮助。

typedef和define的区别