typedef在哪个头文件

typedef在哪个头文件,第1张

typedef 并不是一个头文件,它是一个C/C++语言中的关键字,用于给已有类型起一个新的名字(别名)。在使用 typedef 声明新类型时,需要使用该类型的头文件。例如,如果我们使用 typedef 声明了一个 int 的别名为 myInt,那么在使用 myInt 时需要包含 int 的头文件 #include <inttypes.h>或者 #include <stdint.h>。

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11490236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存