typedef和define区别(通俗)

typedef和define区别(通俗)

总结:typedef和define可对一个对象进行 取别名(typedef) 或 字符替换(define) ,以此增强程序的可读性

typedeff是关键字,对已经存在的数据类型取别名。

在编译阶段处理,会进行类型检查,只能在定义的作用域内使用。

define是预处理指令(宏定义),只进行简单的字符替换,是否产生错误要在编译时才可知。

没有作用域限制,可以对类型/变量/常量等进行替换

与const组合区别:

typedef char* pstr;

“const pstr”会被解释为“char* const”:不能更改指向的地址(常量指针)

如果是define则会被解读为const char*:指针指向一个常量,可以更改指向的地址。

1、typedef:它在自己的作用域内给一个已经存在的类型一个别名。它是在是在编译时处理的。

int main()

{

typedef int size;

size a=3; //等同于int a =3;

fun();

}

int fun()

{

size a=3; //报错

}

2、#define 是预处理指令。在编译预处理时进行简单的替换

tips:一个程序的运行过程,大致可分为:预处理->编译->程序执行。(链接与本知识无关,且不讨论)

(1)预处理:执行预处理指令,进行简单的替换(替换后删除预处理指令)。

#define a 3

int main()

{

printf("%d",a);

return 0;

}

字符替换后其实等同于

int main()

{

printf("%d",3);

return 0;

}

注意此时程序还远远没有执行,只是编译器在执行预处理(比如我们用记事本写东西,假设可以发送,那么记事本先改正拼写,然后再提交给别人,记事本自我改正拼写的功能就是预处理)

显而易见,预处理仅是进行简单的字符替换,不作正确性检查,不管含义是否正确,也没有数据类型一说。

当要替换的字符和定义的变量同名时就会产生定义冲突,如下:

#define a 3

int main()

{

int a=5;

printf("%d",a);

return 0;

}

(2)编译:进行程序的语法检查,检查无错程序再执行,否则直接报错。

平时我们程序运行直接出错,实际就是编译检查出语法错误,如上的定义冲突错误。程序还没到执行的那一步。

所以define宏替换,可能带来的错误只有在编译时才可能发现并报错。

由上可知,define只是程序执行前的字符替换而已,不牵扯程序本身语法或者执行,因此想替换谁替换谁,也没有作用域一说,至于错误,那是编译时候检查的事情了(单纯字符替换对程序运行是缺点,可能造成各种错误)。

(3)运行时,可能产生的问题

#define X int*

typedef int* Y

X p1, p2;

等同于int *p1,p2;//一个指针变量,一个整形变量

Y p1,p2; //两个都是指针变量

//int* 可以是一个类型,显然define把int当做类型,更印证的宏替换没有数据类型。

相关内容

魔域私服太古怎么合?新手必看的战力突破指南
365betmobileapp

魔域私服太古怎么合?新手必看的战力突破指南

🕒 06-29 👁️ 4555
吃鸡多久可以解封游戏 详解游戏封禁与解封规则
365bet手机版中文

吃鸡多久可以解封游戏 详解游戏封禁与解封规则

🕒 07-06 👁️ 8801
微信怎么更新最新版本?两招搞定,别轻易卸载!
365bet手机版中文

微信怎么更新最新版本?两招搞定,别轻易卸载!

🕒 07-05 👁️ 7976