对typedef关键字的理解

前面的话

最近在做魔塔的项目,发现自己对于typedef关键字的理解还不够透彻,有很多处带typedef的代码不太明白,比如以下这句

typedef int (*CollisionCB)(struct Hero* hero, void* that, int nx, int ny);

为此查阅了一些资料,发现typedef并不是我之前理解的简单的代换,和宏定义#define的简单替换是有区别的,以下是我学习后的总结

基本用法

typedef的作用是为一种数据类型定义新名字。

其作用有大概如下几个:

定义机器无关的类型

假设我们要定义一个名为“MYFLOAT”的浮点类型,表示在对应目标机器上的最高精度。

当目标机器支持long double的时候我们可以这样命名

typedef long double MYFLOAT;

当机器不支持long double的时候,我们只需要修改对应的typedef语句

typedef double MYFLOAT;

给现有类型创建一个易于记忆的新名字

例如:

typedef unsigned int UINT;

简化一些复杂的类型声明

例如:

typedef PBase(*Create_XXX)(int x, int y, int type, struct sScene* scene);

这一作用是我比较难理解的地方,首先是一个函数指针,Create_XXX指向一个函数,让Create_XXX作为一个类型来表示。

通常当函数的参数是一个回调函数时,就可能会使用typedef来简化声明(关于回调函数的理解下一篇文章会进行描述),例如下面一个实例:

void RegCreateItemCallback(int type, Create_XXX f);

函数RegCreateItemCallback的第二个参数就是一个回调函数,通过Create_XXX f类型+变量i的形式给出对应回调函数的地址。

typedef与#define的区别

  • #define 进行简单的进行字符串替换。
  • typedef 是为一个类型起新名字。使用 typedef 定义的变量类型,其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。

上面的区别很抽象,所以我们直接列举示例便于理解

typedef char* pStr1;
#define pStr2 char* 
pStr1 s1, s2;
pStr2 s3, s4;

上述代码中,s1、s2、s3都被定义为了char*类型,s4则是char类型,而不是char*类型,这是因为#define只是做了一个简单的字符串替换,替换后的代码其实是

char *s1, *s2;
char* s3, s4;

最后的话

本文仅是个人学习过程中的小总结,如有误恳请指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值