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...)".
这里补充一下函数指针的调用方式:
我以为是: (*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的两种用法的本质都是一样的, 可以概括为一种用法.
typedef的最新理解的更多相关文章
- [math] 我对对数的最新理解
前言 作为资深学渣,每次遇到对数就极度恐慌.恐慌不是因为要考试---.而是因为不理解,只能靠死记硬背运算规则.不能进行有效的推理,这让我极度不爽,因为会忘记.故惶恐. 所以总是耿耿于怀,想要试图理解对 ...
- typedef你真的理解么?
typedef,用最简单的话去诠释他,那么就是给类型取别名!!! 但是他并没有你想象的那么简单! 举例: typedef int size;//那么int就有一个别名叫size了,以后就可以 siz ...
- c语言typedef关键字的理解
1.typedef的定义 很多人认为typedef 是定义新的数据类型,这可能与这个关键字有关.本来嘛,type 是数据类型的意思:def(ine)是定义的意思,合起来就是定义数据类型啦. 不过很遗憾 ...
- 对try-catch-finally异常处理的最新理解
try{ ...... }catch(......){ }finally{ ...... } 这个结构是用来处理Java所有可能出现的异常的,这个我很早其实就已经学过,不过最近看了个视频,感觉自己虽然 ...
- Manifest文件的最新理解
今天看了Manifest文件内容的相关视频,感觉对知识的理解深刻了一些: 首先,先来说说这个文件的作用,这个文件可以说是聚集了很多个标签,其实对于每个主标签,在将来编译的时候,都会被处理成一个类,而标 ...
- 关于Unity物理事件的执行顺序的最新理解
物体A: public class A:{ B b; void FixedUpdate(){ if(input.GetKeyDow(Keycode.I)) { collider.enable=fals ...
- signal函数理解或者void (*signal(int signum,void(*handler)(int)))(int)理解
把void (*signal(int signum,void(*handler)(int)))(int)分成两部分: typedef void (*sighandler_t)(int); sighan ...
- Android JNI编程(六)——C语言函数指针、Unition联合体、枚举、Typedef别名、结构体、结构体指针
版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:函数指针 1.函数指针顾名思义就是定义一个指针变量指向一个函数,和一级指 ...
- typedef int (init_fnc_t) (void)和typedef int (*init_fnc_t) (void)
1.typedef int (init_fnc_t) (void);表示定义init_fnc_t为函数类型,该函数返回int型,无参数.而“init_fnc_t *init_sequence[]= ...
- typedef void (*sighandler_t)(int);
typedef void (*sighandler_t)(int); sighandler_t signal(int signum, sighandler_t handler); ---------- ...
随机推荐
- 3-3 C++ vector类型
目录 3.3.0 模板(Template) vector说明 模板简介 3.3.1 vector的定义和初始化 初始化的方式 总结初始化 3.3.2 往vector中添加元素 3.3.3 vector ...
- You Shi Zai Wo
Xuzhou is a place where there have been more than 50 large-scale battles from ancient times to the p ...
- AI运动小程序开发常见问题集锦二
截止到现在写博文时,我们的AI运动识别小程序插件已经迭代了23个版本,成功应用于健身.体育.体测.AR互动等场景:为了让正在集成或者计划进行功能扩展优化的用户,少走弯路.投入更少的开发资源,针对近期的 ...
- 安卓抓包之SocksDroid
之前一直使用电脑端的Charles代理软件, 然后手机端WiFi代理设置为Charles的代理ip与端口, 也就是8888 但是发现有些软件的请求包是抓取不到的, 于是查看apk源码发现发送网络请求使 ...
- Nginx之yum安装
使用yum进行nginx的安装 参考官网:http://nginx.org/ 1)选择对应系统,例如自己使用的是centos系统 2)配置并安装 sudo yum install yum-utils ...
- C#/.NET/.NET Core优秀项目和框架2024年11月简报
前言 公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的详细介绍.功能特点.使用方式以及部分功能 ...
- ASP.NET Core 9.0 中新增的MapStaticAssets() 中间件
前言 在Core 9.0版本中新增的内容不算多,除了内置OpenAPI 外 应该就属MapStaticAssets中间件最有价值了,最初MapStaticAssets主要是为了解决Blazor静态资源 ...
- Node.js Express 框架(1)
1.Express介绍 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP 工具. Express的特点: 实现 ...
- 斐波那契数列(Java实现)
斐波那契数列 题目描述: 悲波那契数列(Fibonacci sequence)又称黄金分割数列,因数学家莱昂纳多·裴波那契(LeonardodaFibonacci)以兔子繁殖为例子而引入,故又称为&q ...
- vue使用高德地图Amap未定义问题
// 引入高德地图 import VueAMap from 'vue-amap'; Vue.use(VueAMap); // 初始化vue-amap VueAMap.initAMapApiLoader ...