前面的话
最近在做魔塔的项目,发现自己对于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;
最后的话
本文仅是个人学习过程中的小总结,如有误恳请指出!