欢迎来到天天文库
浏览记录
ID:40580017
大小:44.00 KB
页数:3页
时间:2019-08-04
《typedef与define比较》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、typedef与define比较1、typedef和definetypedef在编译时被解释,define在预处理时被替换。#define定义“可读”的常量以及一些宏语句的任务,而typedef则常用来定义关键字、冗长的类型的别名。宏定义只是简单的字符串代换(原地扩展),而typedef则不是原地扩展,它的新名字具有一定的封装性,以致于新命名的标识符具有更易定义变量的功能。typedefintsize;#defineMAX1002、typedef属于存储类声明说明符typedefintsize是一个完整的声明
2、,不可拆分,不能简单的看作这个语句的意思是替int起一个别名为size。3、typedef编译时做的事typedefintsize;sizelength;对sizelength;这条语句来说,在编译时不是把其中的“size”替换为“int”,真实过程应该是这样的:1、length声明为一个size类型。2、typedef语句后面部分中的语句(即intsize)相当于一个一元表达式,其中的size是一个未知数,现在要用length去代入这个一元表达式得到intlength,然后用这个替换得到的一元表达式取代si
3、zelength。3、1和2过程重复,直至一元函数中没有未知数。4、最终得到intlength。可能从上面这个简单的语句解释不足以说清我的理解思路,我们看一个复杂点的:typedefint(*PF)(constchar*,constchar*);PFRegister(PFpf);对PFRegister(PFpf);这条语句来说,在编译时它的过程应该是这样的:1、Register(PFpf)声明为PF类型。2、typedef语句后面部分中的语句(即int(*PF)(constchar*,constchar*))
4、相当于一个一元表达式,其中的PF是一个未知数,现在要用Register(PFpf)去代入这个一元表达式得到int(*Register(PFpf))(constchar*,constchar*)),然后用这个替换得到的一元表达式取代PFRegister(PFpf)。3、1和2过程重复,直至一元函数中没有未知数。4、最终得到int(*Register(int(*pf)(constchar*,constchar*)))(constchar*,constchar*)。其中过程3的详细过程:pf声明为PF类型。type
5、def语句后面部分中的语句(即int(*PF)(constchar*,constchar*))相当于一个一元表达式,其中的PF是一个未知数,现在要用pf去代入这个一元表达式得到int(*pf)(constchar*,constchar*)),然后用这个替换得到的一元表达式取代PFpf。得到int(*Register(int(*pf)(constchar*,constchar*)))(constchar*,constchar*)。#define的作用在C或C++语言源程序中允许用一个标识符来表示一个字符串,称为
6、“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令完成的。宏代换是由预处理程序自动完成的。在C或C++语言中,“宏”分为有参数和无参数两种。无参宏定义 无参宏定义的一般形式为:#define宏名字符串 无参宏的宏名后不带参数。 其定义的一般形式为:#define标识符字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。“
7、标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。 例如: #defineM(a+b) 它的作用是指定标识符M来代替表达式(a+b)。在编写源程序时,所有的(a+b)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(a+b)表达式去置换所有的宏名M,然后再进行编译。 程序1: #defineM(a+b) intmain() { ints,y; printf("inputanumber:"); scanf("%d",&y); s=M*M; printf("s=
8、%d",s); } 上例程序中首先进行宏定义,定义M来替代表达式(a+b),在s=M*M中作了宏调用。在预处理时经宏展开后该语句变为:S=(a+b)*(a+b)但要注意的是,在宏定义中表达式(a+b)两边的括号不能少。否则会发生错误。如当作以下定义后:#defineM(a)+(b)在宏展开时将得到下述语句:S=(a)+(b)*(a)+(b) 对于宏定义还要说明以下几点: 1.宏定义是用宏
此文档下载收益归作者所有