首页 > 常见问题 > 正文

typedef用法有哪些

DDD
发布: 2023-06-09 13:31:22
原创
5170 人浏览过

typedef用法有:1、typedef基本数据类型取“别名”,C语言中的所有数据类型都可以用typedef重新定义类型名;2、typedef为自定义数据类型取“别名”,自定义的数据类型包括:结构体struct name{ }; 、共用体unit name { };、枚举enum { };3、typedef为数组取“别名”;4、typedef为指针取“别名”。

typedef用法有哪些

本文的操作环境:Windows10系统、C++ 20版本、dell g3电脑。

在实际应用中,typedef主要有下面四种用法:

1)typedef基本数据类型取“别名”

也就是说,C语言中的所有数据类型都可以用typedef关键词来重新定义类型名

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
登录后复制
登录后复制
2)typedef为自定义数据类型取“别名”

自定义的数据类型包括:结构体struct name{ }; 、共用体unit name { };、枚举enum { };

struct students{
	char sex;
	char name[120];
	int ages;};
登录后复制
登录后复制

结构体重新定义数据名常用的方法有:

struct students{
	char sex;
	char name[120];
	int ages;}std;std.name[20]="wujunwu"
登录后复制
登录后复制

另外也可以用typedef定义:

struct students{
	char sex;
	char name[120];
	int ages;};typedef struct students std;std.name[20]="wujunwu"
登录后复制
登录后复制
3)typedef为数组取“别名”
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
登录后复制
登录后复制
4)typedef为指针取“别名”
普通指针
int a=2;int* pointer;pointer =&a;
登录后复制
登录后复制

等同于:

int a=2;typedef int* pointer;pointer p;p=&a;
登录后复制
登录后复制

如果a的数据类型是char ,即char a =2;那么,

char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
登录后复制
登录后复制
函数指针
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
登录后复制
登录后复制

其实上面程序执行了两步:
第一步:给指针取“别名”

pCopySDMMC2Mem p1;pBL2Type p2;
登录后复制
登录后复制

第二步:强制类型转换

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;
登录后复制
登录后复制

第三步:给指针赋值

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
登录后复制
登录后复制

小结:使用typedef时,typedef并没有创建任何新类型,它只是为某个已经存在的类型提供一个“别名”,以便在程序中使用。

typedef中的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
登录后复制
登录后复制

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);
登录后复制
登录后复制

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;
登录后复制
登录后复制

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

typedef与#define的区别:

(1)typedef创建的符号名只限于类型,不限于值
(2)typedef由编译器解释,不是预处理器

typedef的四种用法

在实际应用中,typedef主要有下面四种用法:

1)typedef基本数据类型取“别名”

也就是说,C语言中的所有数据类型都可以用typedef关键词来重新定义类型名

typedef unsigned int size;typedef unsigned int16 u16;typedef unsigned int8 u8;...
登录后复制
登录后复制
2)typedef为自定义数据类型取“别名”

自定义的数据类型包括:结构体struct name{ }; 、共用体unit name { };、枚举enum { };

struct students{
	char sex;
	char name[120];
	int ages;};
登录后复制
登录后复制

结构体重新定义数据名常用的方法有:

struct students{
	char sex;
	char name[120];
	int ages;}std;std.name[20]="wujunwu"
登录后复制
登录后复制

另外也可以用typedef定义:

struct students{
	char sex;
	char name[120];
	int ages;};typedef struct students std;std.name[20]="wujunwu"
登录后复制
登录后复制
3)typedef为数组取“别名”
typedef char arr_name[20];arr_name ane; ane[20]="wujunwu"
登录后复制
登录后复制
4)typedef为指针取“别名”
普通指针
int a=2;int* pointer;pointer =&a;
登录后复制
登录后复制

等同于:

int a=2;typedef int* pointer;pointer p;p=&a;
登录后复制
登录后复制

如果a的数据类型是char ,即char a =2;那么,

char a=2;typedef int* pointer;pointer p;p=&(pointer)a;
登录后复制
登录后复制
函数指针
typedef unsigned int bool;typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);typedef void (*pBL2Type)(void);pCopySDMMC2Mem p1=(pCopySDMMC2Mem)0xD0037F98;pBL2Type p2 = (pBL2Type)0x23E00000;
登录后复制
登录后复制

其实上面程序执行了两步:
第一步:给指针取“别名”

pCopySDMMC2Mem p1;pBL2Type p2;
登录后复制
登录后复制

第二步:强制类型转换

(pCopySDMMC2Mem)0xD0037F98;  //真正在写代码时不能这样写(pBL2Type)0x23E00000;
登录后复制
登录后复制

第三步:给指针赋值

p1=(pCopySDMMC2Mem)0xD0037F98;p2 = (pBL2Type)0x23E00000;
登录后复制
登录后复制

小结:使用typedef时,typedef并没有创建任何新类型,它只是为某个已经存在的类型提供一个“别名”,以便在程序中使用。

typedef中的陷阱

接下来看一个简单的 typedef 使用示例,如下面的代码所示:

typedef char* PCHAR;int strcmp(const PCHAR,const PCHAR);
登录后复制
登录后复制

在上面的代码中,“const PCHAR” 是否相当于 “const char*” 呢?

答案是否定的,原因很简单,typedef 是用来定义一种类型的新别名的,它不同于宏,不是简单的字符串替换。因此,“const PCHAR”中的 const 给予了整个指针本身常量性,也就是形成了常量指针“char* const(一个指向char的常量指针)”。即它实际上相当于“char* const”,而不是“const char*(指向常量 char 的指针)”。当然,要想让 const PCHAR 相当于 const char* 也很容易,如下面的代码所示:

typedef const char* PCHAR;int strcmp(PCHAR, PCHAR);
登录后复制
登录后复制

其实,无论什么时候,只要为指针声明 typedef,那么就应该在最终的 typedef 名称中加一个 const,以使得该指针本身是常量。

还需要特别注意的是,虽然 typedef 并不真正影响对象的存储特性,但在语法上它还是一个存储类的关键字,就像 auto、extern、static 和 register 等关键字一样。因此,像下面这种声明方式是不可行的:

typedef static int INT_STATIC;
登录后复制
登录后复制

不可行的原因是不能声明多个存储类关键字,由于 typedef 已经占据了存储类关键字的位置,因此,在 typedef 声明中就不能够再使用 static 或任何其他存储类关键字了。当然,编译器也会报错,如在 VC++2010 中的报错信息为“无法指定多个存储类”。

以上是typedef用法有哪些的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板