四利用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
编译失败,这将提示指定多个存储类;