详谈typedef的用法

我们都知道typedef是类型重定义,既然是重定义就不可能出现新的数据类型,只是将已有的数据类型进行换个名字而已,但是这有什么用呢?可能我们学的时候,给的例子都是:typedef int INT; 然后再用INT去定义一些变量,例如:INT a;

这个就等于int a; 我们当时感觉不出来有什么用,当学到结构体的时候,可能觉得会减少数据类型的写法,像struct student这样一个结构体定义变量的时候如果不用typedef就只能struct student(当然这是在C语言中,在C++中可以省略掉struct直接写student),这样感觉很麻烦,所以才想到用typedef,但是这是他的用法之一,却不是为唯一的用法。

typedef的用法主要我总结了一下三点:

用法一:可以减少代码的书写量

就像我们经常能考虑到的,结构体这样“新的”数据类型,用typedef可以简化,而且不容易出错.例如:

struct student{

  int data;

  char name[10];

}; 当我们定义学生结构体的时候要这么定义struct student s1,s2,s3; 如果想定义结构体指针,我们可以这么定义,struct student *ps1, ps2; 显然ps2不是指针类型,但是好多初学者对指针不熟悉,所以容易出错,但是当我们用typedef的时候,就不会出现这样的错误了,

typedef struct student{

  int data;

  char name[10];

}stu, *pstu;  我们定义的时候可以这么定义stu s1, s2, s3; 定义结构体指针的时候,可以这么定义,pstu ps1, ps2; 这样ps1, ps2都是指针类型的变量 这是typedef的用法之一,也是比较常用的。

用法二:可以实现代码的复用性和可扩展性

如果一段代码没有扩展性和复用性,那么这段代码就不能算得上是一段特别规范的代码,就像我们为了实现代码的复用性,提高程序可读性的时候,用函数一样,提高代码的复用性和可扩展性是作为软件开发者必备的本领。一段好的代码,如果在别的项目中引用的话,如果功能类似,基本上改不了几行,这就是规范性的重要性(这里先不谈规范性,但是这个typedef的用法也涉及规范性,嘿嘿,所以规范是避免不了的)。就这么来说吧,假如我们定义了一个结构体

struct student{

  int score;

  char name[10];

};我们想把成绩改成double类型的,应为int的精度太低了,但是下面用到的地方可能都要改掉,但是,我们要是用typedef一下, 问题就变得简单多了,

typedef int typeitem;

struct student{

  typeitem score;

  char name[10];

};这样直接改typedef就行了,其他的代码根本不用动,这就是分层的原因,我们只改变最底层的,上层的东西根本不用变(就像在链表中,我们可以把它分为三层,纯数据层、节点层、head指针层,也就是整条链)这样分层处理问题会变得简单得多。还有就是平台不同可以兼容,就像有的平台不支持long double类型,但是你如果定义了long double 直接不能用,但是如果这么  typedef long double typeitem; 直接改成可以支持的类型就行啦,根本不用那么麻烦改下面的代码,这也是比较重要的用途。

用途三:简化,提高可读性

想必大家觉得,这个用途不是包含在上面的用途之中了吗,为什么还要再说一遍呢,其实我举个例子你也就明白了,typedef int array[10],这个代表什么意思,这可不是平时那种array[10】是个int了吧,这个代表,array是个重定义的类型,array a; 就代表a是一个含有10个int型元素的数组,这么定义可能觉得简化不了多少,还不如直接int a[10];看着明白呢,好! 继续往下看,typedef array Array[5]; 这个呢,如果我这么定义一个变量 Array arr[2]; 这个又是什么意思呢?这个就是定义个Array类型数组,其中这个“一维”数组有两个元素,但是每个元素又都是Array 类型的,每个Array又是一个5行10列二维数组,所以arr就是一个三维数组,他就等于int arr[2][5][10]; 是不是看的有点蒙了, 其实在C语言中根本不存在多维数组,全部都是一维数组,只是一维数组里面又含一维数组,所以才构成了所谓的“多维”数组, 如果这样理解的话,是不是觉得多维数组也就不那么“神奇”了,变得简单了,没有那么晕了,这样定义的好处就是可以讲一个多维的数组转化成我们比较熟悉的一维数组,这样操作起来就比较容易了,可读性自然也会增强。所以这就是他的“简化”的作用。其实我们还可以在函数指针上体现,想定义个函数指针int (*p)(); 我们可以定义为typedef int (*POWER)(); 接下来可以直接定义POWER p1, p2; 他就等价于int (*p1)(), int (*p2)(); 这样也非常易懂。

定义方法:

下面来谈一下他的定义过程,说了这么多,还没讲到怎么定义,其实也就三步: 第一步: 按照定义变量的方法先写出定义体(想必这么都比较熟悉吧), 例如: int a; 第二步: 将变量名换成想要重定义的名字 例如: int INT; 第三步: 在最前面加上typedef 例如: typedef int INT; 整个步骤就完成了,下面就可以用重定义的类型定义变量了:例如: INT a; 就是这么简单,不要想那么复杂。

还有就是与宏定义区分开来,宏定义是在编译预处理的时候直接进行的替换,而typedef却不是,宏定义特别是写那个表达式的时候新手容易出错就是不能真正理解宏替换,就像这么例子: #define mul(a, b) a * b ,如果这么写mul(2, 3)那么恭喜,你对了, 但是如果这么写, mul(2 + 1, 3 + 4); 你的出来的结果一定是错的,它只是简单地替换, 不会像函数那样会先计算出来2 + 1 等于 3 然后在进行计算, 它只能替换为2 + 1 * 3 + 4 所以结果当然错了……新手注意点就好了,这东西挺简单的。

大致就将这么多,如果那里写的不好,多多指教,多多补充!^_^

时间: 2024-10-12 19:40:29

详谈typedef的用法的相关文章

结构体定义 typedef struct 用法详解和用法小结

typedef是类型定义的意思.typedef struct 是为了使用这个结构体方便.具体区别在于:若struct node {}这样来定义结构体的话.在申请node 的变量时,需要这样写,struct node n;若用typedef,可以这样写,typedef struct node{}NODE; .在申请变量时就可以这样写,NODE n;区别就在于使用时,是否可以省去struct这个关键字. 第三篇:struct和typedef struct 分三块来讲述:1 首先:在C中定义一个结构体

关于typedef的用法

在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异.它本身是一种存储类的关键字,与auto.extern.mutable.static.register等关键字不能出现在同一个表达式中. typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到. 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象 typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图,而不只是简单

[转载]typedef常见用法

注:本文系转载,并修改了一些错误. typedef常见用法 1.常规变量类型定义 例如:typedef unsigned char uchar描述:uchar等价于unsigned char类型定义 uchar c声明等于unsigned char c声明 2.数组类型定义例如: typedef int array[2];描述: array等价于 int [2]定义; array a声明等价于int a[2]声明 扩展: typedef int array[M][N];描述: array等价于

关于typedef的用法总结

不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中.typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法. 用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量: 以下则可行: typedef char* PCHAR; PCHAR pa, pb; 这种用法很有用,特别是char

C基础--关于typedef的用法总结

转自:http://blog.csdn.net/wangqiulin123456/article/details/8284939 在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多.typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析. 基本定义 用途一:与#define的区别 用途二:减少错误 用途三:直观

基于typedef的用法详解【转】

也许新手用这个关键字不多,但它却是一个很有用的关键字,可以使代码模块化程度更好(即与其它代码的关联较少),在C++中还是实现Traits技术的基础,也是模板编程的基本语法之一. 若说变量定义是为变量命名,而typedef(或称为类型定义)就是为类型命名.既然都是命名,那就会有很多类似的地方.而变量定义我想大家都会使用,因此类型定义也必然会使用. 类型定义的语法可以归结为一句话:只要在变量定义前面加上typedef,就成了类型定义.这儿的原本应该是变量的东西,就成为了类型.如,下面的变量定义:in

C/C++语法知识:typedef struct 用法详解

第一篇:typedef struct与struct的区别 1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明. 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述. 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器

关于oc中出现的typedef的用法/定义函数指针

typedef int (^calculateBlock)(int a,int b); 这里面typedef的作用只是给 calculateBlock取了一个 别名,说明以后可以直接使用. calculateBlock类似于*所以可以有类似的用法,以后可以直接使用calculateBlock来定义方法.例: - (int)calculateWithNumber1:(int)number1 andNumber:(int)number2 andCalculate:(calculateBlock)ca

typedef的用法总结

用途一: 定义一种类型的别名,而不只是简单的宏替换.可以用作同时声明指针型的多个对象.比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针, // 和一个字符变量: 以下则可行: typedef char* PCHAR; PCHAR pa, pb; 这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR就不会出现这样的问题,减少了错误的发生. 用途二:用在旧的C