C语言中typedef的作用以及与#define的区别

转载自:https://blog.csdn.net/libing403/article/details/73402411
在原文的基础上进行了一些小的改动,我觉得更完善了一些;

(1)typedef是什么

typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称。

(2)与#define的4个不同点:

(1)typedef并没有创建任何新类型,它只是为某个已存在的类型(比如unsigned char)增加一个方便使用的标签,而#define只是为一个字符或字符串或数字重新起了一个名字

(2)typedef创建的符号名只受限于类型,不能用于值,而#define都可以,但是本质是不同的,看下文分析;

(3)typedef由编译器解释,不是预处理器。

(4)在其受限范围内,typedef比#define更灵活。

(3)typedef和#define的工作原理

示例:假设要用BYTE表示1字节的数组。

typedef unsigned char BYTE;

随后就可以用BYTE来定义变量:

BYTE X,Y[10],*Z;

上面一行代码就相当于

unsigned char X,Y[10],*Z;

所以,typedef相当于给一个已有的类型起了一个新的名字,然后可以像使用旧类型名一样使用新的类型名来声明变量。

(4)采用typedef的方式编程的优势

(1)合理使用typedef可以增加程序的可读性,前面的示例中用BYTE代替unsigned char表明你打算用BYTE类型的变量表示数字,而不是字符码。

(2)typedef可以提高程序的可移植性。我们知道sizeof运算符的返回值是size_t类型,time()函数返回的类型:time_t类型。这是一个无符号数,但它不是一个新类型。这就用到了C语言的typedef机制,允许程序员为现有类型创建别名。C头文件系统使用typedef把size_t作为unsigned int或unsigned long的别名。这样,使用size_t类型时,编译器会根据不同的系统替换标准类型。对于time_t类似,只要包含time.h头文件,程序就能访问合适的定义。

(5)#define和typdef在功能上的一些重合与区别

下面两行代码能够体现两者功能上的重合:

#define BYTE unsigned char
typedef usigned char BYTE;

但typedef也有#define没有的功能:

typedef char * STRING;

编译器把STRING解释为一个类型的表示符,该类型指向char。因此

STRING name, sign;

相当于

char * name , * sign;   

但是,如果这样假设:

#define STRING char *

然后,下面的声明:

STRING name, sign;

将被翻译成:

char * name, sign;

这导致name才是指针,而sign不是。

(6)typedef更强大的一个功能

除了刚才上面提到的可读性和可移植性的好处外,在一些场合还可以发挥typedef的更多好处。

使用typedef的第一个原因:为经常出现的类型创建一个方便、易识别的类型名。

例如,typedef用来命名一个结构类型,可以省略结构的标签:

typedef struct {double x; double y;} rect;

那么可以这样使用rect类型名:

rect r1={3.0, 6.0};
rect r2;

以上代码被翻译成

struct {double x; double y;} r1={3.0, 6.0};
struct {double x; double y;} r2; 

使用typedef的第二个原因是:typedef常用于给复杂的类型命名。例如,下面的声明:

typedef char (* FRPTC()) [5];

把FRPTC声明为一个函数类型,该函数返回一个指针,该指针内含5个char类型元素的数组。

使用typedef时要记住,typedef并没有创建任何新类型,它只是为某个已存在的类型增加一个方便使用的标签。

通过结构、联合和typedef,C提供了有效处理数据的工具和处理可移植数据的工具。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值