typedef的最新理解

说是新解,其实一点都不新,只是我以前没有学会typedef的真正用法.

但是我感觉应该有些同学没有掌握typedef的用法,所以写出来分享一下.

 

 

1.typedef的常规用法

typedef unsigned int  UNIT;

UINT b;

需要注意的地方有下面几点:

define 前面替代后面, typedef后面替代前面,这个不要记混了.

②typedef 后面有"分号",宏定义没有.

UINT是unsigned int类型的别名.

 

 

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...)".

 

 

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的两种用法的本质都是一样的, 可以概括为一种用法.

代价就是推翻了以前的理解,不过以前的理解本来就是片面的!

 

欢迎讨论和补充~

猜你喜欢

转载自www.cnblogs.com/Younger-Zhang/p/10563115.html