说是新解,其实一点都不新,只是我之前没有学会typedef的真正用法.函数
可是我感受应该有些同窗没有掌握typedef的用法,因此写出来分享一下.spa
1.typedef的常规用法指针
typedef unsigned int UNIT;基础
UINT b;变量
须要注意的地方有下面几点:方法
①define 前面替代后面, typedef后面替代前面,这个不要记混了.分享
②typedef 后面有"分号",宏定义没有.语言
UINT是unsigned int类型的别名.co
2.使用typedef简化复杂的定义结构体
这是一个简单的函数指针的定义:
int (*pFun1)(int); //在后面加上" = &fun"能够实现初始化, 其中&无关紧要
假如再定义多个相同类型的函数指针,还能够:
int (*pFun2)(int);
int (*pFun3)(int);
...
那么这也太麻烦了,假如使用typedef,就能够:
typedef int (*pFun)(int);
pFun pFun1;
pFun pFun2, pFun3;
方便了不少!
使用typedef简化复杂的定义的本质,就是:
"用定义好的变量(pFun就是定义好的函数指针变量),表明变量的类型(函数指针类型),来定义相同类型的变量(pFun1,pFun2...)".
这里补充一下函数指针的调用方式:
我觉得是: (*pFun1)(10);
其实直接使用: pFun1(10)也是能够的!
由于函数名和函数指针,在调用和赋值的时候是不加区分的,既然函数名能够赋值给函数指针,
调用的时候,通常使用函数名,那么咱们使用函数指针应该也是能够调用的!
咱们甚至能够无聊的定义函数: void fun(int a);
而后调用的时候把fun当成指针: (*fun)(19);
3.两种用法
我之前只知道第一种用法,看kernel代码的时候发现有不少定义看不懂.
好比出现了定义: pFun pfun1;
我会认为在C/C++中,自定义的类型只有结构体和类,因此pFun必定是结构体了.
可是根据使用方法,pfun1倒是函数指针的用法?因此就会很懵逼.
如今明白了,原来能够经过typedef定义一种任何一种变量类型,包括基础变量类型没法直接定义的函数指针.
C语言中实现相似多态性的功能,不少都是经过函数指针来实现的,因此typedef简化复杂的函数指针定义在kernel中很常见!
这两种方法有什么区别?
回过头来看第一种用法,其本质未尝不是"用定义好的变量,表明变量的类型,来定义相同类型的变量"?
咱们常见:
typedef unsigned int UNIT;
UINT b;
好像就是给unsigned int取了一个别名.
其实这种写法一直以来都给咱们一种误解,这不是没法体现typedef的本质.
假如咱们写成:
typedef unsigned int a;
不看typedef,就是定义了一个变量a, typedef的做用,就是让变量a具备"表明变量类型去定义相同类型变量"的功能!
而后才有: a b;
具体a定义的是什么类型,是由"假设没有typedef时, a做为变量时的类型"决定的.
这样一来,typedef的两种用法的本质都是同样的, 能够归纳为一种用法.
代价就是推翻了之前的理解,不过之前的理解原本就是片面的!
欢迎讨论和补充~