四利用Linuxtypedef两陷阱

使用1:



定义别名类型,而不仅仅是简单的宏替换。它可以用作多个对象,同时声明指针类型:



这类字符最不符合我们的意图,它只声明一个指向字符指针变量的指针,



和一个字符变量;



以下是可行的:



typedef char * PChar / /资本;一般用途



PChar的PA、PB; / /可行,同时宣布两点字符指针变量



虽然:



字符*,* PB;



这也是可行的,但它在typedef形式比较不直观,特别是在大量的指针是需要的,是更经济的方式定义。



用两:



在旧的C代码中帮助结构,在前面的代码中,当声明一个新的结构对象时,必须取结构,即结构名对象名的形式,如:



结构tagpoint1



{



int x;



y;



};



结构tagpoint1 P1;



在C++中,你可以直接写:该结构的名称,即:



tagpoint1 P1;



一个人认为写一个结构太多太麻烦了,所以发明了它:



定义标记点



{



int x;



y;



}点;



这一点比编写原始结构的方法少,很容易,特别是在大量使用时。



也许,在C++中定义,使用不太大,但了解它有助于掌握旧代码。毕竟,在项目的早期我们可能会遇到遗留下来的代码。在那之后,我们可以看到我们过去的两个代码仍然可用。



使用三:



typedef是用来定义独立于平台的类型。



例如,在目标平台一上定义一个称为实的浮点类型,使之成为最高精度类型:



typedef long double REAL;



在平台上不支持长双,改为:



Typedef双房;



在平台三不支持的情况下,它被更改为:



typedef浮房;



也就是说,当平台是跨平台的,只是改变typedef本身不到其他源代码做任何更改。



这种技术被广泛应用于标准库,如size_t。



此外,因为typedef定义了一个新的类型的别名,而不是一个简单的字符串替换,它比宏观更强大,尽管有时它也可以实现上述目的。



使用四:



一个新的简单的别名是一个复杂的定义,方法是在原申报的别名代替一些复杂的声明,以便与变量名的部分可以留到最后的更换,和最简化的版本的原始语句得到。举个例子 uff1a



1。原始语句:int *(* { 5 })(int,char *);



变量名是一个,它有可能取代一个新的别名pfun。



typedef int *(* pfun)(int,char *);



原始声明的最简单版本:



pfun一{ 5 };



2。原始语句:空(* b { 10 })(空(*)());



变量名是第一次,在代替括号正确的部分,并pfunparam是别名之一:



typedef void(* pfunparam)();



更换左变量B,pfunx作为别名两:



typedef void(* pfunx)(pfunparam);



原始声明的最简单版本:



pfunx B { 10 };



三.最初的声明:双(*)()()(* e){ 9 };



变量名是E,而剩下的部分被替换,并pfuny是别名之一:



Typedef双(* pfuny)();



替换变量在右边,E,和pfunparamy别名两



Typedef pFuny(* pfunparamy){ 9 };



原始声明的最简单版本:



PFunParamy E;



理解复杂的语句可用右左法则:从最初的变量名,然后往左,右,碰到一个括号的方向应该转变;在支架通过跳出括号,或顺序,后的第一个周期左右,直至语句结束。举一个例子:uff1a



Int(*函数)(int * p);



先找到一个名为func,一对圆括号外,左边是一个*,说明func是一个指针,然后跳出圈子;括号,先看右边,并会见了括号,表示(*函数)是一个函数,那么函数是一个指针函数指针是一个指向函数的指针,该函数有一个int值,返回类型是int。



Int(*函数{ 5 })(int *);



函数是一个函数操作符,是一个有5个元素的数组;左边的函数有一个*,函数元素是一个指针(注*不是修改函数,而是函数{ 5 },原因是高优先级,而不是{操作符},函数首先要结合{ })。跳出括号,看右边,遇到圆括号。结果表明函数数组的元素是函数类型的指针。它所引用的函数具有int *类型参数,返回值类型为int。



您还可以记住2种模式:



类型(*)(…)函数指针



类型(*){数组指针



---------------------------------



陷阱1:



记住,定义是一种新型的别名,定义不同的Yu Hong,这不是一个简单的字符串替换。例如:



首先定义:



新的类型pStr;



然后:



Int mystrcmp(const PSTR,const PSTR);



const PSTR实际上相当于const char *不是,它实际上相当于char *const。



原因是常量给整个指针本身一个常量,也就是说,常量指针,char * const,是形成的。



简而言之,记住当const和typedef定义一起出现,将不是一个简单的字符串替换。



陷阱二:



Typedef语法关键字存储类(如汽车,外部的,可变的,静态的,登记,等等),但它并没有真正影响对象的存储特性,如:



Typedef static int INT2; / / not feasible



编译失败,这将提示指定多个存储类;