typedef 详解

typedef,看名称,就是类型定义,它,真的就用在类型定义。

它创建一种新的数据类型名称。

注意,是数据类型名称,不是数据类型。

也就是说,typedef并不创建新的类型,typedef只是在已有数据类型(比如 int,char等)上,给这个已有类型起一个别名。

 

typedef 应用场景:

 

1. 变量:

typedef int Length;    // 给int数据类型创建一个名称,叫Length;

Length len, maxlen;    // 可以用Length代替int,声明变量,声明的变量,数据类型就是int.

                                    // 这个声明,等同于 int len, maxlen;

 

2. 指针:

typedef char *String;                    // 给char *这个指针类型创建一个名称,叫String

String rich = "I am a rich man!";        // 等同于 char *rich = "I am a rich man!";

 

3. 结构体:

// 包含结构体stRect声明,

// 和typedef结构体类型stRect一个新的名称 Rect

typedef struct stRect

{

    int x;

    int y;

    int width;

    int height;

}Rect;

Rect size;            // 等同于struct stRect size;

或者

struct stRect

{

    int x;

    int y;

    int width;

    int heigth;

};                // 先声明一个结构体

typedef sturct stRect Rect;        // 再用typedef生成一个名称 Rect;

Rect size;            // 等同于 struct stRect size;

 

4. 函数指针。

关于函数指针的细节,请参照《指针函数和函数指针深入剖析

void (*pf1)(int);

void (*pf2)(int);

void (*pf3)(int);

声明三个函数指针,

这三个函数指针可以用来指向一个无返回值(void),有一个int参数的函数;

每次声明函数指针,都差不多要跟声明函数原型一样了,敲这个多字符,好累好烦怎么办?

typedef void (*pFUNC)(int);        // 给"无返回值,有一个int参数的函数指针"类型生成一个新名称,叫pFUNC;

pFUNC pf1, pf2, pf3, pf4;    // 比 void (*pf1)(int)..这种轻松多了吧?

或者

typedef void FUNC(int);            // 给"无返回值,有一个int参数的函数"类型生成一个新名称,叫FUNC;

FUNC *pf1. *pf2. *pf3, *pf4;        // 既然类型是 FUNC,那指针,便是 FUNC *;

 

TIPS:

typedef 能否用 #define 来代替?比如 typedef int Length,可否替换成 #define Length int?

某些应用场合上是可以的,比如 typedef int Length,替换成 #define Length int,完全没有问题;

但它俩是完全不同的概念

#define 是预处理指令,只是简单地做字符串替换,不做类型检查;

#define Length int在预处理时把相关的Length字符串替换成int;

#define Length intxxxxxaabb,不进行变量声明(Length aa),编译也是能通过的。

typedef 是关键字,在编译时处理,做类型检查。

typedef int Length后,Length 就是一种类型,这种类型跟int一样。

typedef intxxxaaaba Length,不管进不进行变量声明,是无法通过编译的。

 

 

typedef 的作用:

1. 提高程序的可移植性,方便程序在不同平台上移植。

    比如,定义一个变量,其值范围是0~0xABCDEF13;

    在 32 位机上开发程序时,使用 unsigned int var(32位机unsigned int是32位,范围0~0xFFFFFFFF) ,符合!如果要把写好的程序移植到 16 位机上时,unsigned int var长度是16位,范围0~65535,不符合,怎么办呢?

    如果不使用typedef,就需要把程序里所有用unsigned int 声明的变量,全部变成 unsigned long。

    如果使用 typedef,只需要 typedef unsigned int DWORD;在声明变量时,使用 WORD var;如果需要把程序移植到16位机上时,只需要更改一个 typedef unsigned long DWORD 就行了。

2. 提高程序的可读性

    为变量或者结构体,创建一个看起来一目了然的类型名称,让人一眼就知道这个类型是做什么的。

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值