iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++ typedef常见用法详解
  • 136
分享到

C++ typedef常见用法详解

C++ typedef用法C++ typedef 2023-03-08 14:03:35 136人浏览 薄情痞子
摘要

目录typedef的4种常见用法:typedef的4种用法详解两大陷阱typedef 与 #define的区别typedef的4种常见用法: 给已定义的变量类型起个别名定义函数指针类

typedef的4种常见用法:

  • 给已定义的变量类型起个别名
  • 定义函数指针类型
  • 定义数组指针类型
  • 为复杂的声明定义一个新的简单的别名

总结一句话:“加不加typedef,类型是一样的",这句话可以这样理解:

没加typedef之前如果是个数组,那么加typedef之后就是数组类型;

没加typedef之前如果是个函数指针,那么加typedef之后就是函数指针类型;

没加typedef之前如果是个指针数组,那么加typedef之后就是指针数组类型。

typedef char TA[5];//定义数组类型
typedef char *TB[5];//定义指针数组类型,TB定义的变量为含5个char*指针元素的数组(指针数组类型)
typedef char *(TC[5]);//指针数组类型,因为[]的结合优先级最高,所以加不加()没啥区别,TC等价于TB
typedef char (*TD)[5];//数组指针类型,TD指向一个5容量的char数组
后文简单介绍下指针数组和数组指针

typedef的4种用法详解

1、给已定义的变量类型起个别名

(1)typedef unsigned char uin8_t; //uint8_t就是unsigned char的别名,这是最基础的用法;

(2)结构体用法——作用是给struct __person起了个别名person_t,这种这种用法也很基础;

struct __person
{
    char    name[20];
    uint8_t age;
    uint8_t height;
}
typedef __person person_t;
 
//以上两段代码也可合并为一段,如下:
typedef struct __person
{
    char    name[20];
    uint8_t age;
    uint8_t height;
}person_t;

2、定义函数指针类型

首先来看一下如何定义函数指针变量,然后再看如何定义函数指针类型。

(1)定义函数指针变量

定义了一个函数指针变量pFunc,它可以指向这样的函数:返回值为int,形参为char*、int:

int (*pFunc)(char *frame, int len);

定义了5个函数指针变量:pFunc[0]、pFunc[1]···,它们都可以指向这样的函数:返回值为int*,形参为int:

int *(*pFunc[5])(int len);

(2)定义函数指针类型

定义函数指针类型,必须使用typedef,方法就是,在“定义函数指针变量”前加上typedef。

typedef int (*pFunc_t)(char *frame, int len);//定义了一个类型pFunc_t

举例:

typedef  int (*pFunc_t)(char *frame, int len);//定义了一个类型pFunc_t
int read_voltage(char *data, int len)
{
    int voltage = 0;
    ···//其他功能代码
    return voltage;
}
int main(void)
{
    pFunc_t   pHandler = read_voltage;//使用类型pFunc_t来定义函数指针变量
    ···//其他功能代码
}

3、定义数组指针类型

这个问题还是分两步,先看如何定义数组指针变量,再看如何定义数组指针类型。

(1)定义数组指针变量

  • int(*pArr)[5];//定义了一个数组指针变量pArr,pArr可以指向一个int [5]的一维数组

  • char(*pArr)[4][5];///定义了一个数组指针变量pArr,pArr可以指向一个char[4][5]的二维数组

char(*pArr)[4][5];///定义了一个数组指针变量pArr,pArr可以指向一个char[4][5]的二维数组

int(*pArr)[5];//pArr是一个指向含5个int元素的一维数组的指针变量
int a[5] = {1,2,3,4,5};
int b[6] = {1,2,3,4,5,6};
pArr = &a;//完全合法,无警告
pArr = a;//发生编译警告,赋值时类型不匹配:a的类型为int(*),而pArr的类型为int(*)[5]
pArr = &a[0];//发生编译警告,赋值时类型不匹配:a的类型为int(*),而pArr的类型为int(*)[5]
pArr = &b;//发生编译警告,赋值时类型不匹配:&b的类型为int(*)[6],而pArr的类型为int(*)[5]
pArr = (int(*)[5])&b;//类型强制转换为int(*)[5],完全合法,无警告

上面这个例子中,使用类型转换时,代码的样式略显复杂,试想,我们如果强转为一个结构体数组的指针,那这个强转的括号里的内容得多长!这就直接影响了代码的可读性,因此,强转后的类型应该定义出来。

(2)定义数组指针类型

如同上面定义函数指针类型的方法,直接在前面加typedef即可,例如:

typedef int (*pArr_t)[5];//定义了一个指针类型pArr_t,该类型的指针可以指向含5个int元素的数组
typedef int(*pArr_t)[5];//定义一个指针类型,该类型的指针可以指向含5个int元素的一维数组
 
int main(void)
{
    int a[5] = {1,2,3,4,5};
    int b[6] = {1,2,3,4,5,6};
    pArr_t pA;//定义数组指针变量pA
    pA= &a;//完全合法,无警告    
    pA= (pArr_t)&b;//类型强制转换为pArr_t,完全合法,无警告
}

(3)定义数组类型

如果我们想声明一个含5个int元素的一维数组,一般会这么写:int a[5];

如果我们想声明多个含5个int元素的一维数组,一般会这么写:int a1[5], a2[5], a3[5]···,或者 a[N][5]

可见,对于定义多个一维数组,写起来略显复杂,这时,我们就应该把数组定义为一个类型,例如:

typedef int arr_t[5];//定义了一个数组类型arr_t,该类型的变量是个数组。
typedef int arr_t[5];
int main(void)
{
    arr_t d;        //d是个数组,这一行等价于:  int d[5];
    arr_t b1, b2, b3;//b1, b2, b3都是数组
    
    d[0] = 1;
    d[1] = 2;
    d[4] = 134;
    d[5] = 253;//编译警告:下标越界
}

4、为复杂的声明定义一个新的简单的别名

为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化版。举例:

int *(*a[5])(int, char*);//原声明
 
typedef int *(*pFun)(int, char*); //变量名为a,直接用一个新别名pFun替换a就可以了
pFun a[5];//原声明的最简化版
void (*b[10]) (void (*)());//原声明
 
typedef void (*pFunParam)();//变量名为b,先替换右边部分括号里的,pFunParam为别名一
typedef void (*pFunx)(pFunParam);//再替换左边的变量b,pFunx为别名二
 
pFunx b[10];//原声明的最简化版

两大陷阱

陷阱一:记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。

陷阱二:typedef在语法上是一个存储类的关键字(如auto、extern、mutable、static、reGISter等一样),虽然它并不真正影响对象的存储特性。

typedef 与 #define的区别

案例一:

通常讲,typedef要比#define要好,特别是在有指针的场合。请看例子:

typedef char *pStr1;  
#define pStr2 char *;  
pStr1 s1, s2;  
pStr2 s3, s4; 

在上述的变量定义中,s1、s2、s3都被定义为char *,而s4则定义成了char,不是我们所预期的指针变量,根本原因就在于#define只是简单的字符串替换而typedef则是为一个类型起新名字。

案例二:

下面的代码中编译器会报一个错误,你知道是哪个语句错了吗?

typedef char * pStr;  
char str[4] = "abc";  
const char *p1 = str;  
const pStr p2 = str;  
p1++;  
p2++; 

是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数据类型为pStr 的变量p2为只读,因此p2++错误。

对于指针数组和数组指针的概念,相信很多人经常会感到迷惑,见到二者一时不能分辨究竟对应哪一个才是对的。接下来我们来分析一下二者区别。

我们来看一下这个示例代码:

int *ptr1[10];
int (*ptr2)[10];

对于上述代码语句,你是否能分清哪一句代码声明的是指针数组,而哪一句代码声明的又是数组指针呢?

答案是第一行代码声明的ptr1是一个指针数组,数组名为 ptr1,而“int*”修饰的是数组的内容,该数组包含 5 个 指向 int 类型 数据的指针。第二行代码声明的ptr2则是一个 数组的指针 ,指针变量名为 ptr2,而 int 修饰的是数组的内容,即数组的每个元素。即ptr2 是一个指针,它指向一个包含 5 个 int 类型数据的数组。

这里其实可以首先看*能否与前面的类型结合,能的话,内容就是结合后的内容。

到此这篇关于c++ typedef用法详解的文章就介绍到这了,更多相关C++ typedef用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++ typedef常见用法详解

本文链接: https://www.lsjlt.com/news/199020.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++ typedef常见用法详解
    目录typedef的4种常见用法:typedef的4种用法详解两大陷阱typedef 与 #define的区别typedef的4种常见用法: 给已定义的变量类型起个别名定义函数指针类...
    99+
    2023-03-08
    C++ typedef用法 C++ typedef
  • C++ typedef常见用法有哪些
    本篇内容主要讲解“C++ typedef常见用法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++ typedef常见用法有哪些”吧!typedef的4种常见用法:给...
    99+
    2023-07-05
  • 详解android adb常见用法
    ADB,即 Android Debug Bridge,是 Android 开发/测试人员不可替代的强大工具。 adb与应用的连接 1.启动/停止 启动 adb server 命令: ...
    99+
    2024-04-02
  • C语言中typedef的用法以及#define区别详解
    目录1、简洁定义 2、为已有类型起别名 为字符数组起别名为指针起别名3、typedef 和 #define 的区别总结1、简洁定义 C语言允许为一个数据类型起一个新的别名,就像给人...
    99+
    2024-04-02
  • C语言之结构体定义typedef struct用法详解
    在C语言中,使用struct关键字可以定义一个结构体类型,用于存储不同类型的数据。为了方便使用,可以使用typedef关键字给结构体...
    99+
    2023-08-09
    C语言
  • c++中typedef的用法
    typedef 用于在 c++ 中创建别名,使其具有以下优点:提高代码可读性和可维护性简化类型转换强制类型安全 C++ 中 typedef 的用法 定义 typedef typedef...
    99+
    2024-05-01
    c++ 代码可读性 typedef
  • C/C++中typedef的用法大全
    目录一、为基本数据类型起别名二、为结构体起别名三、为指针类型起别名四、为函数指针类型起别名五、为数组类型起别名六、为枚举类型起别名七、为模版函数起别名一、为基本数据类型起别名 typ...
    99+
    2023-05-17
    C++ typedef用法 C++ typedef
  • 详解C++中typedef 和 #define 的区别
    1、执行上不同 关键字 typedef 在编译阶段有效,由于是在编译阶段,因此 typedef 有类型检查的功能。 #define 则是宏定义,发生在预处理阶段,也就是编译之前,它只...
    99+
    2024-04-02
  • 详解C语言中typedef和#define的用法与区别
    目录一、typedef的用法二、#define的用法三、typedef与#define的区别四、typedef的用途用途一用途二用途三用途四五、typedef的陷阱陷阱一陷阱二一、t...
    99+
    2024-04-02
  • c++中typedef struct的用法
    typedef struct 语法用于创建新的结构体类型别名,其语法为:typedef struct struct_name { 结构体成员声明 } new_type_name;它允许使...
    99+
    2024-05-01
    c++ typedef
  • 关于vector的常见用法详解
    目录vector的定义vector容器内元素的访问一、通过下标访问二、通过迭代器访问vector常用函数vector的常见用途vector翻译为向量,但是这里使用“变长数...
    99+
    2023-02-06
    vector的常见用法 vector用法 c++ vector
  • 详解Java8中Optional的常见用法
    目录一、 简介二、Java8 之前,空指针异常判断三、Optional的使用1.创建Optional实例2.访问 Optional 对象的值3.返回默认值4.返回异常 (常...
    99+
    2024-04-02
  • c++ 中vector 常见用法
    目录1、c++ 中 vector2、初始化3、常用函数 1、c++ 中 vector vector有两个参数,一个是size,表示当前vector容器内存储的元素个数,一个是capa...
    99+
    2024-04-02
  • c#使用listbox的详细方法和常见问题解决
    关于ListBox ListBox是WinForm中的列表控件,它提供了一个项目列表(一组数据项),用户可以选择一个或者多个条目,当列表项目过多时,ListBox会自动添加滚动条,使...
    99+
    2024-04-02
  • c语言中typedef struct的用法
    typedef struct 在 c 语言中用于创建结构体类型别名,简化结构体使用。它通过指定结构体别名将一个新的数据类型作为现有结构体的别名。优点包括增强可读性、代码重用和类型检查。注...
    99+
    2024-05-09
    c语言 作用域 typedef
  • typedef在c语言中的用法
    typedef在c语言中创建类型别名,用法步骤如下:声明类型别名:使用typedef关键字和现有数据类型定义新名称。使用别名声明变量:用类型别名代替原始数据类型进行变量声明。好处包括提高...
    99+
    2024-04-29
    c语言 代码可读性 typedef
  • typedef struct在c语言中用法
    typedef 关键字用于创建自定义数据类型的别名,允许简化复杂结构的名称。使用步骤如下:创建自定义数据类型(如结构体);使用 typedef 将其赋予一个新名称(别名);使用别名替代原...
    99+
    2024-05-09
    c语言 代码可读性 typedef 标准库
  • c#委托的常见用法
    C#委托是一种引用类型,可以用于封装方法并传递给其他方法,常见的用法有以下几种:1. 事件处理: 委托可以用于处理事件,当事件触发时,委托可以调用相应的方法来处理事件。例如,可以使用EventHandler委托来处理按钮的点击事件。2....
    99+
    2023-08-09
    C#
  • C++中常见的代码重用问题详解
    C++中常见的代码重用问题详解在软件开发中,代码重用是提高开发效率和代码可维护性的重要方法之一。C++作为一种广泛使用的编程语言,提供了多种重用代码的机制,如函数、类、模板等。然而,代码重用并不总是简单和直接的,往往会遇到一些常见的问题。本...
    99+
    2023-10-22
    继承 (Inheritance) 多态 (Polymorphism) 代码重用问题 C++中常见的编程关键词有: (
  • C++中常见的代码复用问题详解
    C++中常见的代码复用问题详解代码复用是软件开发中的重要概念,它可以提高开发效率和代码质量。然而,在C++语言中,存在一些常见的代码复用问题,如代码重复、可维护性差等。本文将详细介绍这些问题,并给出具体的代码示例,帮助读者更好地理解和解决这...
    99+
    2023-10-22
    接口 (interface) 继承 (Inheritance) 组合 (Composition)
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作