欢迎来到天天文库
浏览记录
ID:39990876
大小:124.42 KB
页数:9页
时间:2019-07-16
《typedef interrupt》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、函数型指针一个函数被执行时,在程序空间中占据一定空间,这个空间的起始地址是用函数名来表示的,称为函数的入口地址。也可以用指针指向这个入口地址,并通过该指针变量来调用这个函数。这种指针变量称为函数型指针变量,其一般形式为:数据类型标识符(*指针变量名)();例如:int(*f)();上式定义了指针f,f指向的函数返回整型类数据。注意其中(*f)中的括弧不可缺少,标识f是先与*结合,是指针变量,然后再与后面的()结合,表示此指针指向函数。在281xC中,还增加了interrupt中断关键字(见下面的内
2、容),因此可定义如下数据类型:typedefinterruptvoid(*PINT)(void);在上句中,定义了指针PINT为指向一个特殊的函数interrupt型函数的指针类型。由于在使用interrupt时,函数应被定义成返回void,而且无参数调用,因此在(*PINT)的后面加上(void),表示PINT是指向函数的指针,且无参数调用。在(*PINT)的前面加上interruptvoid,表示PINT指向中断函数,无参数返回值。这样,在描述PIE中断矢量表时,可以定义如下的结构:struc
3、tPIE_VECT_TABLE{PINTPIE1_RESERVED;PINTPIE2_RESERVED;PINTPIE3_RESERVED;…}即该结构体的元素为函数指针类型,注意这里的interrupt只是说明PINT是指向中断函数类型指针。如果没有interrupt,typedefvoid(*PINT)(void),则PINT还是表示指向函数的指针类型。只是不属于中断函数。可见后面的typedef用途4其中,PIE_VECT_TABLE是一个结构类型,其中的所有成员均为中断函数的首地址,即指向
4、中断函数的指针。因此,在定义其成员如PIE1_RESERVED等时,要在其前面加PINT,表示PIE1_RESERVED是PINT类型的变量,即指向中断函数的指针。这样程序显得比较简洁。用途一:定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:char*pa,pb;//这多数不符合我们的意图,它只声明了一个指向字符变量的指针,//和一个字符变量;以下则可行:typedefchar*PCHAR;PCHARpa,pb;用途二:用在旧的C代码中,帮助struct。以前的代
5、码中,声明struct新对象时,必须要带上struct,即形式为:struct结构名对象名,如:structtagPOINT1{intx;inty;};structtagPOINT1p1;而在C++中,则可以直接写:结构名对象名,即:tagPOINT1p1;typedefstructtagPOINT{intx;inty;}POINT;POINTp1;//这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时候或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握
6、以前的旧代码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。用途三:用typedef来定义与平台无关的类型。比如定义一个叫REAL的浮点类型,在目标平台一上,让它表示最高精度的类型为:typedeflongdoubleREAL;在不支持longdouble的平台二上,改为:typedefdoubleREAL;在连double都不支持的平台三上,改为:typedeffloatREAL;也就是说,当跨平台时,只要改下typedef本身就行,不用对其他源码做任何修改。标准库就广泛使用
7、了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。用途四:为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:原声明:void(*b[10])(void(*)());变量名为b,先替换右边部分括号里的,pFunParam为别名一:typedefvoid(*pFunParam)();//这里pFunParam指向函数的指
8、针类型.注意是一个类型再替换左边的变量b,pFunx为别名二:typedefvoid(*pFunx)(pFunParam);原声明的最简化版:pFunxb[10];原声明:doube(*)()(*e)[9];变量名为e,先替换左边部分,pFuny为别名一:typedefdouble(*pFuny)();再替换右边的变量e,pFunParamy为别名二typedefpFuny(*pFunParamy)[9];原声明的最简化版:pFunParamye;理解复杂声明可用的“右左法则”:从
此文档下载收益归作者所有