cc++之typedef的⽤法
本⽂参考⽹络资料,相关博客链接如下:
typedef:重新定义⼀种数据类型(或者是给类型起别名)。
C语⾔允许⽤户使⽤ typedef 关键字来定义⾃⼰习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与⽤户⾃定义的结构型名称、共⽤型名称、枚举型名称等。⼀旦⽤户在程序中定义了⾃⼰的数据类型名称,就可以在该程序中⽤⾃⼰的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。
typedef的⽤法:
1.为基本数据类型定义新的类型名: typedef unsigned int uint32
1.1    也就是说,系统默认的所有基本类型都可以利⽤ typedef 关键字来重新定义类型名
1.2    我们还可以使⽤这种⽅法来定义与平台⽆关的类型。
⽐如,要定义⼀个叫 REAL 的浮点类型,在⽬标平台⼀上,让它表⽰最⾼精度的类型,
即:typedef long double REAL;
当跨平台移植程序时,甚⾄还可以在连 double 都不⽀持的平台上,我们只需要修改⼀下 typedef 的定义即可,
⽽不⽤对其他源代码做任何修改。
其实,标准库中⼴泛地使⽤了这个技巧,⽐如 size_t 在 VC++2010 的 crtdefs.h ⽂件中的定义如下所⽰:
#ifndef _SIZE_T_DEFINED
#ifdef  _WIN64
typedef unsigned __int64    size_t;
#else
typedef _W64 unsigned int  size_t;
#endif
#define _SIZE_T_DEFINED
#endif
2. 为⾃定义数据类型(结构体、共⽤体和枚举类型)定义简洁的类型名称
以结构体为例,下⾯我们定义⼀个名为 Point 的结构体:
struct Point
{
double x;
double y;
double z;
};
在调⽤这个结构体时,我们必须像下⾯的代码这样来调⽤这个结构体:
struct Point oPoint1={100,100,0};
struct Point oPoint2;
在这⾥,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上⾯的调⽤⽅法⼀样有保留字 struct,
⽽不能像 int 和 double 那样直接使⽤ Point 来定义变量。
现在,我们利⽤ typedef 定义这个结构体,如下⾯的代码所⽰:
typedef struct tagPoint
{
double x;
double y;
double z;
} Point;
因此,现在你就可以像 int 和 double 那样直接使⽤ Point 定义变量,如下⾯的代码所⽰:
Point oPoint1={100,100,0};
Point oPoint2;
结构中包含指向它⾃⼰的指针
struct tagNode
{
char *pItem;
struct tagNode *pNext;
};
typedef struct tagNode *pNode;
3. 为数组定义简洁的类型名称
typedef int INT_ARRAY_100[100];
INT_ARRAY_100 arr;
4. 为指针定义简洁的名称
typedef char* PCHAR;
PCHAR pa;
// PFun是我们创建的⼀个类型别名
typedef int *(*PFun)(int,char*);
// 使⽤定义的新类型来声明对象,等价于int*(*a[5])(int,char*);
PFun a[5];
#define与typedef的区别和⽤法:
1、宏替换: 只能⽤#define了,⽐如:#define PI 3.14
2、给简单数据类型起别名:
2.1 #define uint32 unsigned int 
2.2 typedef unsigned int uint32
//其实这两个是⼀样的。
3、声明⼀个指向简单数据类型变量的指针
3.1 #define uint32_p  unsigned int *
如果我们只⽤来声明⼀个指针变量是没问题的,但是要是出现这样⼀种情况:uint32_p  p1,p2;        结果会怎样呢?
根据#define替换的功能,可以解析成 unsigned int *p1,p2;
⽽这个声明的作⽤与我们之前的⽬的是完全不⼀样了吧。
3.2 typedef unsigned int*  uint32_p
uint32_p,是⼀种新的数据类型,完全可以⽤它去声明uint32_p  p1,p2;
4、结构体类型的声明:
typedef struct{
uint32 a;
uint16 *p;
uint16 array[10];
}m_T;       
我们可以直接⽤m_T声明结构体变量;m_T  m1,*m2;
⽽且我们可以把这个声明放在⼀个头⽂件⾥,⽅便其它想使⽤这个声明的地⽅。c语言struct用法例子
这⾥要是换成⽤#define实现会怎样呢?你可以试试⼀下
5、我们看这样⼀个表达式,也是学习指针(函数指针、指针函数)最为经典的例⼦:
(*(  void (*)()  )0)();            //硬件地址跳到0处
void(*)()    :是⼀个函数指针类型的声明,声明了⼀个指向返回值类型为void的函数的函数指针,
假设fp是⼀个函数指针,那么如何调⽤fp所指向的函数,调⽤⽅法如下:
(*fp)();
要是从硬件的0地址启动,似乎(*0)();就可以调⽤指向0地址的函数。但是,这样是⽆效的。fp必须是⼀个指针    现在就可以把“0”强制转换成函数指针类型,: ( void (*)() )0
现在(*  ( void (*)() )0  )();            //外部调⽤⼀个函数指针,函数指针是 void (*)()型的函数指针
如果在程序的其它地⽅也会⽤到void (*)(), 我们是不是考虑⼀下,⽤typedef  void(*)() A
当再要定义返回值类型为void类型的函数指针时只⽤写:    A a;,  之前的例⼦就可以写作:(*(A)0)();
如果换成#define void (*)() A,是不会也能实现这个效果呢?
写到这⾥我要借助C陷阱与缺陷⾥的内容了,请⼤家⾃⼰理解:
使⽤ typedef 的⽬的 or 好处:
1、为了隐藏特定类型的实现,强调类型的使⽤⽬的
2、允许⼀种类型⽤于多个⽬的,同时使得每次使⽤给类型的⽬的明确
如:typedef int (*Function)(const char *, const char *);
该定义表⽰ Function 是⼀种指向函数的指针的类型的别名,
要使⽤这种指针类型时只需直接使⽤ Function即可,
不必每次把整个声明都写出来
void (*Signal(int,void(*)(int)))(int);
typedef void (*HANDLER)(int);
HANDLER Signal(int,HANDLER);
上下两种声明意义是⼀致的

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。