typedef的用法

深入理解C++中的类型特征(Type Traits) 类型特征是C++标准库中的一组模板类和模板结构,它们提供了关于类型的信息。这些信息可以包括类型是否是某种特定类型、类型的大小、类型是否可复制等。类型特征通常用于模板编程中,以便在编译时做出决策,从而实现更灵活和高效的代码。除了使用标准库提供的类型特征外,程序员还可以根据需要自定义类型特征。自定义类型特征通常需要定义一个模板结构,并使用等工具来实现。类型特征是C++中一个非常强大的工具,它为模板编程提供了丰富的类型信息。 阅读详情

关于typedef的用法总结

    不管实在C还是C++代码中,typedef这个词都不少见,当然出现频率较高的还是在C代码中。typedef与#define有些相似,但更多的是不同,特别是在一些复杂的用法上,就完全不同了,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,以下是引用的内容(红色部分是我自己写的内容)。

用途一:

定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如:

char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,

// 和一个字符变量;

以下则可行:

typedef char* PCHAR;

PCHAR pa, pb;  

这种用法很有用,特别是char* pa, pb的定义,初学者往往认为是定义了两个字符型指针,其实不是,而用typedef char* PCHAR就不会出现这样的问题,减少了错误的发生。

用途二:
用在旧的C代码中,帮助struct。以前的代码中,声明struct新对象时,必须要带上
struct,即形式为: struct 结构名对象名,如:

struct tagPOINT1

 {
    int x;

    int y;
};

struct tagPOINT1 p1;

而在C++中,则可以直接写:结构名对象名,即:tagPOINT1 p1;

typedef struct tagPOINT
{
    int x;

    int y;
}POINT;

POINT p1; // 这样就比原来的方式少写了一个struct,比较省事,尤其在大量使用的时

候,或许,在C++中,typedef的这种用途二不是很大,但是理解了它,对掌握以前的旧代

码还是有帮助的,毕竟我们在项目中有可能会遇到较早些年代遗留下来的代码。

用途三:

用typedef来定义与平台无关的类型。

比如定义一个叫 REAL 的浮点类型,在目标平台一上,让它表示最高精度的类型为:

typedef long double REAL;

在不支持 long double 的平台二上,改为:

typedef double REAL;

在连 double 都不支持的平台三上,改为:

typedef float REAL;

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。

标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。
     这个优点在我们写代码的过程中可以减少不少代码量哦!

用途四:

为复杂的声明定义一个新的简单的别名。方法是:在原来的声明里逐步用别名替换一部

分复杂声明,如此循环,把带变量名的部分留到最后替换,得到的就是原声明的最简化

版。举例: 

 原声明:void (*b[10]) (void (*)());

变量名为b,先替换右边部分括号里的,pFunParam为别名一:

typedef void (*pFunParam)();

再替换左边的变量b,pFunx为别名二:

typedef void (*pFunx)(pFunParam);

原声明的最简化版:

pFunx b[10];
 
原声明:doube(*)() (*e)[9];

变量名为e,先替换左边部分,pFuny为别名一:

typedef double(*pFuny)();

再替换右边的变量e,pFunParamy为别名二

typedef pFuny (*pFunParamy)[9];

原声明的最简化版:

pFunParamy e;

理解复杂声明可用的“右左法则”:从变量名看起,先往右,再往左,碰到一个圆括号

就调转阅读的方向;括号内分析完就跳出括号,还是按先右后左的顺序,如此循环,直

到整个声明分析完。举例:

int (*func)(int *p);

首先找到变量名func,外面有一对圆括号,而且左边是一个*号,这说明func是一个指针

;然后跳出这个圆括号,先看右边,又遇到圆括号,这说明(*func)是一个函数,所以

func是一个指向这类函数的指针,即函数指针,这类函数具有int*类型的形参,返回值

类型是int。

int (*func[5])(int *);

func右边是一个[]运算符,说明func是具有5个元素的数组;func的左边有一个*,说明

func的元素是指针(注意这里的*不是修饰func,而是修饰func[5]的,原因是[]运算符

优先级比*高,func先跟[]结合)。跳出这个括号,看右边,又遇到圆括号,说明func数

组的元素是函数类型的指针,它指向的函数具有int*类型的形参,返回值类型为int。

这种用法是比较复杂的,出现的频率也不少,往往在看到这样的用法却不能理解,相信以上的解释能有所帮助。

*****以上为参考部分,以下为本人领悟部分*****

使用示例:

1.比较一:

#include <iostream>

using namespace std;

typedef int (*A) (char, char);

int ss(char a, char b)
{
    cout<<"功能1"<<endl;

    cout<<a<<endl;

    cout<<b<<endl;

    return 0;
}
 
int bb(char a, char b)
{

    cout<<"功能2"<<endl;

    cout<<b<<endl;

    cout<<a<<endl;

    return 0;

}

void main()
{

    A a;

    a = ss;

    a('a','b');

    a = bb;

    a('a', 'b');
}

2.比较二:

typedef int (A) (char, char);

void main()
{

    A *a;

    a = ss;

    a('a','b');

    a = bb;

    a('a','b');
}
 

两个程序的结果都一样:

功能1

a

b

功能2

b

a

 

*****以下是参考部分*****

参考自:http://blog.hc360.com/portal/personShowArticle.do?articleId=57527

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 string[4] = "abc";

const char *p1 = string;

const pStr p2 = string;

p1++;

p2++;

  是p2++出错了。这个问题再一次提醒我们:typedef和#define不同,它不是简单的

文本替换。上述代码中const pStr p2并不等于const char * p2。const pStr p2和

const long x本质上没有区别,都是对变量进行只读限制,只不过此处变量p2的数据类

型是我们自己定义的而不是系统固有类型而已。因此,const pStr p2的含义是:限定数

据类型为char *的变量p2为只读,因此p2++错误。虽然作者在这里已经解释得很清楚了,可我在这个地方仍然还是糊涂的,真的希望哪位高手能帮忙指点一下,特别是这一句“只不过此处变量p2的数据类型是我们自己定义的而不是系统固有类型而已”,难道自己定义的类型前面用const修饰后,就不能执行更改运算,而系统定义的类型却可以?

 


SV学习总结1--typedef enum与enum等用法及typedef常见用法总结 直接声明枚举变量时,变量名不具备类型标识功能,这是两段代码本质区别。typedef 的核心价值是创建类型别名,使代码更简洁;→ 后续尝试用变量名声明新变量会报错。将匿名枚举类型定义为新类型名。声明变量(本质是类型别名)类型名 ordinal_e。变量 position。第一段代码(正确✅)第二段代码(错误❌) 阅读详情

相关推荐

typedef 的用法总结

这些高级用法展示了typedef的强大和灵活性,能够使代码更加模块化、可维护并增强类型安全。你可以通过typedef为复杂的类型、结构体、函数指针、数组和指针定义别名,简化代码。提供类型安全,避免类型错误。与#define、条件编译等结合使用,实现更复杂的类型定义。

dlz0836的博客 769

C++ typedef用法详解

转自http://wenku.baidu.com/view/733ee308581b6bd97f19ead0.html,经过整理 typedef的语法描述 在现实生活中,信息的概念可能是长度,数量和面积等。在C语言中,信息被抽象为int、float和 double等基本数据类型。从基本数据类型名称上,不能够看出其所代表的物理属性,并且int、float和double为系统关键字,不可以...

weixin_33965305的博客 988

ESP32 BLE Mesh Provisioner实战:手把手教你用ESP-IDF配网智能灯泡(附常见错误排查)

本文提供了一份基于ESP-IDF的ESP32 BLE Mesh Provisioner实战指南,详细解析了配网器的核心角色与工作流程。文章手把手教你从工程搭建、代码初始化到核心回调解析,并重点针对常见的‘Model not bound to AppKey’等错误提供了深度排查思路与解决方案,帮助你构建一个稳定可靠的智能照明网关。

desk3的博客 514

C语言typedef的用法详解

C语言typedef的用法详解 转载过来的,作者解释的比较详细,通俗易懂。。 一.基本概念剖析 int* (*a[5])(int, char*);       //#1 void (*b[10]) (void (*)()); //#2 double(*)() (*pa)[9];          //#3 1.C语言中函数声明和数组声明。函数声明一般是这样: int

沙漠的甲壳虫的博客 841

子图同构之乌尔曼算法Ullmann Algorithm的python实现

给定两个图Ga​(子图)和Gb​(原图),其中Ga​有pa​个点和qa​条边,Gb​有pb​个点和qb​条边,其邻接矩阵分别为A和B。子图同构的关键在于找到一种从Ga​的点到Gb​的点的映射MM是一个pa​行pb​列的矩阵,且满足每行只有一个1(表示Ga​中的一个点唯一地映射到Gb​中的一个点),每列至多一个1(确保Gb​中的点不会被重复映射)。定义Ccij​MMBT,若在图Ga​。

weixin_42822813的博客 1974

WPF数据可视化:LiveCharts自定义X轴与Y轴的5个实战技巧(附完整代码)

本文详细介绍了在WPF应用中使用LiveCharts进行数据可视化时,自定义X轴与Y轴的5个核心实战技巧。内容涵盖精确控制刻度步距、深度定制视觉样式、实现多轴布局对比、优化显示空间以及构建响应式动态轴,并提供了完整的C#和XAML代码示例,帮助开发者创建专业且用户体验出色的图表。

moss5的博客 692

类型别名typedef使用

typedef的几种用法: 1、为类型定义别名 例1: typedef double DOUBLE; //DOUBLE是类型double的别名 DOUBEL d = 3.14; //等价于 double d = 3.14 例2: typedef int Int; //定义类型int的别名是Int typedef Int INT, *INT_PTR; //INT是Int的别名,INT_PTR是int*的别名 例3: typedef stuct Stude

qq_37070988的博客 453

Java写项目前的准备工作指南(技术栈选择 环境搭建和工具配置 项目结构设计与模块划分)

在开始编写一个 Java 项目之前,做好充分的准备工作是至关重要的。很多初学者可能在没有清晰规划的情况下就开始编写代码,导致项目开发进度缓慢、结构混乱,甚至最终无法按预期完成。而事实上,项目的成功不仅仅取决于编码能力,还包括项目初期的规划和准备。准备工作是确保项目顺利进行的基础,它包括技术选型、环境搭建、需求分析、团队协作及项目管理等多个方面。通过这些准备,我们可以确保项目的开发不仅高效而且有可维护性,最终能交付出高质量的代码。在项目开发过程中,异常处理是非常关键的一部分。

eternal__day的博客 1188

【C语言】typedef

一、C语言允许对已有的数据类型定义另外的类型名,目的是为了增强程序的可读性。重命名数据类型的命令是typedef,他一C语言形式出现在程序中。 typedef的一般形式如下: typedef 已有类型名 新类型名; 例如: typedef int intWith; typedef float floatWith; 二、示例讲解 1. Typedef作用简介 #include

北往风吹 1839

使用 MediaPipe 身体跟踪构建不良身体姿势检测和警报系统

详细介绍如何使用 MediaPipe 身体跟踪构建不良身体姿势检测和警报系统,并附实现的源码下载链接

DT程序员的博客 1815

某智能物流无人值守系统 ExportReport SQL注入漏洞复现

某智能物流无人值守系统 ExportReport存在SQL注入漏洞,未经身份验证的远程攻击者除了可以利用 SQL 注入漏洞获取数据库中的信息(例如,管理员后台密码、站点的用户个人信息)之外,甚至在高权限的情况可向服务器中写入木马,进一步获取服务器系统权限。

0xSec 818

C++ typedef 以及 typedef struct 用法

C++ typedef 以及typedef struct 用法1 概述2 typedef作用及用法3 区别 #define4 typedef struct在c/c++中的区别4.1区别一4.2区别二5 参考资料 1 概述 typedef 为C语言的关键字,作用是为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 typedef 本身是一种存储类的关键字,与 auto、extern、static、register 等关键字不能出现在同一个表

liuluan03161009的博客 8255

【fpdlink显示】DS90UB948关于941连接948 GPIO调试问题

1. 前言 使用一个941连接2 948显示: 941的GPIO0/1/2/3到前948的GPIO0/1/2/3和941的D_GPIO0/1/2/3到948的GPIO0/1/2/3。 设置gpio3输出,则941的D_GPIO3设置高,而948的gpio3设置不高; 但设置gpio3输入后,看到941的D_GPIO3跟随948的gpio3变化。 2. 原理图连接 3. 测试代码 static int du90ub941_enable_port(struct goodix_ts_d

jzwjzw19900922的博客 2556

C++ 中typedef的用法总结

在总结中,比较简单的我只是做了简略的总结,对我来说比较难理解的做了重点的解析。用于为基本数据类型定义一个新的名字,使代码更具可读性或便于修改。示例:这里将int类型定义为Integer,之后就可以使用Integer来声明变量,就像使用int一样。这种方式在代码中如果需要频繁使用int类型,并且希望提高代码可读性(例如,Integer可能暗示这个int变量在特定的业务逻辑中有特殊含义)或者在需要修改类型时(比如将int改为long),只需要修改typedef语句即可。在深入typedef。

small__dogs的博客 4521

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4215

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Typedef Struct 用法详解

Typedef Struct 用法详解 一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间。 实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性...

PengCoX 9937

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

typedef用法详解

typedef与#define的区别: (1)typedef创建的符号名只限于类型,不限于值 (2)typedef由编译器解释,不是预处理器 typedef的四种用法 在实际应用中,typedef主要有下面四种用法: 1)typedef基本数据类型取“别名” 也就是说,C语言中的所有数据类型都可以用typedef关键词来重新定义类型名 typedef unsigned int size; typedef unsigned int16 u16; typedef unsigned int8 u8; . . .

wu_junwu的博客 4万+

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

typedef的用法简介

作用 typedef是C语言的一个重要的关键字,是为数据类型的定义一个新的名字。也就是类型的别名。 例: 定义一个int 型变量,并对其赋值,输出变量的值 #include<stdio.h> int main(void) { int a = 10; printf("a = %d", a); return 0; } 如果我想使A代表int类型呢?也就是A是int的别名 #include<stdio.h> typedef int A; int main(void)

shanglala的博客 1万+

typedef的用法——c语言

typedef的用法

weixin_47783699的博客 1万+

c语言中typedef的用法

typedef是为现有的类型起一个别名,使使用起来更加的方便,注意一点,它并没有产生新的类型。 typedef int BOOL;为int型起了一个新的别名BOOL。例如下边的代码,BOOL为int的别名,然后就可以直接使用了。 typedef int BOOL; #define TRUE 1 #define FALSE 0 BOOL flag = TRUE; 在结构体中的用法 typ...

Mr.yang 2万+

C语言中typedef的用法

double x;double y;double z;在这里,结构体 struct Point 为新的数据类型,在定义变量的时候均要向上面的调用方法一样有保留字 struct,而不能像 int 和 double 那样直接使用 Point 来定义变量。double x;double y;double z;} Point;在上面的代码中,实际上完成了两个操作:double x;double y;double z;

pangyushuang的博客 1万+

typedef的详细用法

不太想谈#define, 在题主的例子的这种用法里, 它就是个文本替换工具, 预处理器完成的, 无脑替换, 跟word里的replace一模一样, 不关编译器的事. 我想谈一下typedef. 搞懂了c++创始人写的<the design and evolution of cpp>中的下面这个例子, 有助于你理解typedef: typedef int P(); typedef int Q(); class X { static P(Q); // 等价于`static int Q()`,

寻梦&之璐 4454

关于typedef的用法

见示例: CASE 1 #include<stdio.h> typedef int ZHAGNSAN;//为 int 再重新多取一个名字, ZHAGNSAN等价于 int typedef struct Student { int sid; char name[100]; char sex; }ST; int main(void) { int i...

有趣的人生 一半是山川湖海 一半是初心情怀 219

python typedef用法_typedef的用法,C语言typedef详解

C语言允许用户使用 typedef 关键字来定义自己习惯的数据类型名称,来替代系统默认的基本类型名称、数组类型名称、指针类型名称与用户自定义的结构型名称、共用型名称、枚举型名称等。一旦用户在程序中定义了自己的数据类型名称,就可以在该程序中用自己的数据类型名称来定义变量的类型、数组的类型、指针变量的类型与函数的类型等。例如,C 语言在 C99 之前并未提供布尔类型,但我们可以使用 typedef 关...

weixin_39963830的博客 1117
上一篇: 常见的几个Qt编程问题的处理
下一篇: const的用法
lixingworkCCC
博客等级 码龄15年 24粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值