typedef是C/C++常用语法,typedef作用,归结起来,可以分为四种:
1、定义一种类型名
常规的应用中,想要定义两个字符指针,写下如下代码: char *a, b
(1)char* a,b
(2)char c='m'
(3)a=&c
(4)b=&c
上述代码是错误的,只有a为字符指针,b仍旧为字符变量。通过#define进行宏定义,仍然是无效的,因为宏定义仅仅是字符替换。
以下则可行:
(1)typedef char* PCHAR
(2)PCHAR pa, pb
2、用于struct结构体
(1)#include <stdio.h>
(2)struct tagPOINT1
(3) {
(4)int x
(5)int y
(6)}
(7)int main()
(8){
(9)tagPOINT1 p1,p2//此句编译无法通过
(10)//错误信息:error: unknown type name 'tagPOINT1'
(11) //环境:Gcc 4.8.1
(12)}
必须采用如下定义
(1)struct tagPOINT1 p1,p2//必须有关键字 struct
(2)采用typedef,则可以省掉结构体定义时的struct
(3)ypedef struct tagPOINT
(4){
(5)int x
(6)int y
(7)}POINT
(8)POINT p1// 这样就比原来的方式少写了一个struct。
3、跨平台移植
程序编写中,如果考虑到平台移植的因素,则需要从代码中抽象出硬件层的差异,例如,变量所占空间,端模式等等。
考虑一个浮点型变量,在不同的硬件平台上,所占据的空间有可能不同,此时,可以采用typedef将其定义到单独的头文件内,该头文件是纯粹抽象硬件相关的内容:
(1)typedef float REAL
(2)typedef short int INT16
(3)typedef int INT32
(4)...
这样的话,如果将来考虑到程序的移植,只需要修改该头文件即可。
4、为复杂的声明取别名
复杂的声明形如:void (*b[10]) (void (*)())
意思:首先*b[10]为指针数组,它里面的十个元素全是指针。到底是什么指针呢,是一个返回类型为空,形参为空的函数指针。
这种复杂的声明,可以用typedef进行简化:
首先:声明后面的函数指针:
(1)typedef void (pFunParam *)()
接着声明前面的指针数组:
(1)typedef void (*pFunx)(pFunParam)
原声明的最简化版:
pFunx b[10]
本文档在撰写过程中,参考了网络博客typedef用法
里面提到一个复杂的声明:
(1)doube(*)() (*e)[9]
而然这个声明在gcc下编译时不通过的,按照作者的本意,似乎应该这样声明:
(1)double (*(*e)[9])()
e是一个指向9维数组的指针,数组内为函数指针,该函数指针形参为空,返回类型为double。
这样的话,应该采用这样的typedef来简化声明:
typedef (*(*ptr)[9])()
扩展资料
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。
参考资料来源:百度百科-typedef
C语言允许为一个数据类型起一个新的别名,就像给人起“绰号”一样。起别名的目的不是为了提高程序运行效率,而是为了编码方便。例如有一个结构体的名字是 stu,要想定义一个结构体变量就得这样写:struct stu stu1
struct 看起来就是多余的,但不写又会报错。如果为 struct stu 起了一个别名 STU,书写起来就简单了:STU stu1
这种写法更加简练,意义也非常明确,不管是在标准头文件中还是以后的编程实践中,都会大量使用这种别名。
使用关键字 typedef 可以为类型起一个新的别名。typedef 的用法一般为:typedef oldName newName
oldName 是类型原来的名字,newName 是类型新的名字。例如:typedef int INTEGER
INTEGER a, b
a = 1
b = 2
INTEGER a, b等效于int a, b。
typedef 还可以给数组、指针、结构体等类型定义别名。先来看一个给数组类型定义别名的例子:
typedef char ARRAY20[20]
表示 ARRAY20 是类型char [20]的别名。它是一个长度为 20 的数组类型。接着可以用 ARRAY20 定义数组:ARRAY20 a1, a2, s1, s2
它等价于:char a1[20], a2[20], s1[20], s2[20]
注意,数组也是有类型的。例如char a1[20]定义了一个数组 a1,它的类型就是 char [20],这一点已在VIP教程《数组和指针绝不等价,数组是另外一种类型》中讲解过。
又如,为结构体类型定义别名:
typedef struct stu{
char name[20]
int age
char sex
} STU
STU 是 struct stu 的别名,可以用 STU 定义结构体变量:STU body1,body2
它等价于:struct stu body1, body2
再如,为指针类型定义别名:typedef int (*PTR_TO_ARR)[4]
表示 PTR_TO_ARR 是类型int * [4]的别名,它是一个二维数组指针类型。接着可以使用 PTR_TO_ARR 定义二维数组指针:PTR_TO_ARR p1, p2
按照类似的写法,还可以为函数指针类型定义别名:typedef int (*PTR_TO_FUNC)(int, int)
PTR_TO_FUNC pfunc
【示例】为指针定义别名。#include <stdio.h>
typedef char (*PTR_TO_ARR)[30]
typedef int (*PTR_TO_FUNC)(int, int)
int max(int a, int b){
return a>b ? a : b
}
char str[3][30] = {
"http://c.biancheng.net",
"C语言中文网",
"C-Language"
}
int main(){
PTR_TO_ARR parr = str
PTR_TO_FUNC pfunc = max
int i
printf("max: %d\n", (*pfunc)(10, 20))
for(i=0i<3i++){
printf("str[%d]: %s\n", i, *(parr+i))
}
return 0
}
运行结果:
max: 20
str[0]: http://c.biancheng.net
str[1]: C语言中文网
str[2]: C-Language
需要强调的是,typedef 是赋予现有类型一个新的名字,而不是创建新的类型。为了“见名知意”,请尽量使用含义明确的标识符,并且尽量大写。typedef 和 #define 的区别
typedef 在表现上有时候类似于 #define,但它和宏替换之间存在一个关键性的区别。正确思考这个问题的方法就是把 typedef 看成一种彻底的“封装”类型,声明之后不能再往里面增加别的东西。
1) 可以使用其他类型说明符对宏类型名进行扩展,但对 typedef 所定义的类型名却不能这样做。如下所示:#define INTERGE int
unsigned INTERGE n //没问题
typedef int INTERGE
unsigned INTERGE n //错误,不能在 INTERGE 前面添加 unsigned
2) 在连续定义几个变量的时候,typedef 能够保证定义的所有变量均为同一类型,而 #define
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)