关于C/C++中typedef的定义与用法总结

C#读取CAD文件(dwg/dxf)并处理 项目要求识别CAD图纸(图纸内容与现实事物比例是1:1)中的内容,并提取出一些关键信息。这里的CAD图纸是指CAD文件,包含多种格式,dwg/dxf/dwf/stl/pdf等等。识别其中内容,主要指文件中的图元信息(也叫实体Entity),指线段、圆弧、矩形等图形元素。得到图元基础信息(比如长度、坐标、粗细)后,进一步做处理(如得到交点、得到线段间间隔、圆弧与线段切点等)。听起来有点难,因为作为软件工程师,对CAD相关事物并不了解,它是未知的; 阅读详情

作者: 字体:[增加 减小] 类型:转载 时间:2012-12-13 我要评论

在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多,typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,需要的朋友可以参考下
在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多。typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,看了网上一些C/C++的学习者的博客,其中有一篇关于typedef的总结还是很不错,由于总结的很好,我就不加修改的引用过来了,加上自己的一个分析。

基本定义: 
typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。

用途一:与#define的区别 
typedef 行为有点像 #define 宏,用其实际类型替代同义字。不同点是 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来定义与平台无关的类型。 
typedef 有另外一个重要的用途,那就是定义机器无关的类型,例如,你可以定义一个叫 REAL 的浮点类型,在目标机器上它可以获得最高的精度: 
复制代码代码如下:

typedef long double REAL; 

在不支持 long double 的机器上,该 typedef 看起来会是下面这样: 
复制代码代码如下:

typedef double REAL; 

并且,在连 double 都不支持的机器上,该 typedef 看起来会是这样: 
复制代码代码如下:

typedef float REAL; 

也就是说,当跨平台时,只要改下 typedef 本身就行,不用对其他源码做任何修改。 
标准库就广泛使用了这个技巧,比如size_t。另外,因为typedef是定义了一种类型的新别名,不是简单的字符串替换,所以它比宏来得稳健。 

用途五:掩饰复合类型 
typedef 还可以掩饰复合类型,如指针和数组。 
例如,你不用像下面这样重复定义有 81 个字符元素的数组: 
复制代码代码如下:

char line[81]; 
  char text[81]; 

定义一个 typedef,每当要用到相同类型和大小的数组时,可以这样: 
复制代码代码如下:

typedef char Line[81]; 

此时Line类型即代表了具有81个元素的字符数组,使用方法如下: 
复制代码代码如下:

Line text, secondline; 
  getline(text); 

同样,可以象下面这样隐藏指针语法: 
复制代码代码如下:

typedef char * pstr; 
  int mystrcmp(pstr, pstr); 

这里将带我们到达第一个 typedef 陷阱。标准函数 strcmp()有两个‘ const char *'类型的参数。因此,它可能会误导人们象下面这样声明 mystrcmp(): 
复制代码代码如下:

int mystrcmp(const pstr, const pstr); 

用GNU的gcc和g++编译器,是会出现警告的,按照顺序,‘const pstr'被解释为‘char* const‘(一个指向 char 的指针常量),两者表达的并非同一意思。为了得到正确的类型,应当如下声明: 
复制代码代码如下:

typedef const char* pstr; 

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

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。 

用途七:typedef 和存储类关键字(storage class specifier) 
这种说法是不是有点令人惊讶,typedef 就像 auto,extern,mutable,static,和 register 一样,是一个存储类关键字。这并不是说 typedef 会真正影响对象的存储特性;它只是说在语句构成上,typedef 声明看起来象 static,extern 等类型的变量声明。下面将带到第二个陷阱: 
复制代码代码如下:

typedef register int FAST_COUNTER; // 错误 

编译通不过。问题出在你不能在声明中有多个存储类关键字。因为符号 typedef 已经占据了存储类关键字的位置,在 typedef 声明中不能用 register(或任何其它存储类关键字)。
一文读懂AUTOSAR CAN通信 在AUTOSAR的分层和模块化架构中,使用PduR(Protocal Data Unit Router)将总线或者网络数据进行抽象,使得上层应用不用关心信号的来源。本文从PduR下层的CAN Interface、CAN Driver和CAN Transceiver Driver模块介绍CAN总线在AUTOSAR架构中的工作机制以及信号的收发等功能。PduR以及COM等上层模块的介绍可以参考公众号内发布的历史文章。 阅读详情

相关推荐

三维Copula建模进阶:从对称、嵌套到Pair-Copula(C-Vine/D-Vine)到底怎么选?

本文深入探讨三维Copula建模的进阶策略,包括对称Archimedean、嵌套结构和Vine Copula(C-Vine/D-Vine)的选择方法。通过对比数学特性、计算复杂度和实际应用案例,提供了一套针对金融风险分析等场景的决策框架,帮助分析师根据数据特征选择最优模型。

weixin_27038701的博客 436

c/c++中typedef详解

1. typedef 最简单使用 typedef long byte_4; // 给已知数据类型long起个新名字,叫byte_4 你可以在任何需要 long 的上下文中使用 byte_4。注意 typedef 并不创建新的类型。它仅仅为现有类型添加一个同义字。 2. typedef 修饰数组 typedef char mySizes[100]; mySizes xxx;

脚踏实地,仰望星空 1万+

Xilinx Blockset Counter计数器模块使用及参数配置

本文详细介绍了Simulink中Xilinx Blockset库Counter模块的使用以及参数说明。

白码王子小张的博客 1096

【C/C++】typedef用法详解

typedef 声明,简称 typedef,人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。本文下面将竭尽全力来揭示 typedef 强大功能以及如何避免一些常见的陷阱。 一、typedef的四个用途 1.1、用途一:定义一种类型易于记忆的别名,而不只是简单的宏替换。 a...

qq_34018840的博客 5829

kettle多表数据迁移

点击 文件——新建——作业,在左侧的 核心对象 标签下选择 通用,双击添加一个 start ,一个 转换 ,一个 作业 和一个 成功 到右侧的作业面板,这些作业项都可以改名字。点击文件—新建—转换,在左侧的 核心对象 标签下选择 输入 下的 表输入,双击添加到右侧的转换面板,再选择 作业 下的 复制记录到结果 ,双击添加到右侧的转换面板。新建转换,在左侧的 核心对象 标签下选择 作业 下的 从结果获取记录,双击添加到右侧的转换面板,再选择 作业 下的 设置变量 ,双击添加到右侧的转换面板。

u014061745的博客 1341

8-阿里云服务器 ECS配置R及Studio Server

步骤概览:(首先要明确自己的系统然后进行安装)

hx2024的博客 1570

C++ typedef用法小结 (※不能不看※)

第一、四个用途 用途一: 定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb; // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,  // 和一个字符变量; 以下则可行: typedef char* PCHAR; // 一般用大写 PCHAR pa, pb; // 可行,同时声明了两个指向字符变量的指针 虽然:

wtuetnsrmh的专栏 2286

第14.11章 高翔博士最新开源框架Lightning-LM源码解读(十一):离线定位模块全解析,从激光匹配到位姿图优化的极致优化

本文介绍了Lightning-LM离线定位模块的技术架构与实现细节。该模块基于3D激光雷达与IMU融合,采用改进版NDT匹配算法实现高精度定位,具备动态图层更新、多源信息融合等特性。核心流程包括数据预处理、激光里程计处理、IMU预测与点云去畸变、位姿图优化等环节,通过轻量级miao库实现高效增量优化。文章详细解析了模块的代码结构、关键函数功能及数据流,为SLAM系统的开发与优化提供了实践参考。

行知SLAM 375

C++ 中typedef的用法总结

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

small__dogs的博客 4521

加速访问Cloudflare的网站的解决方案

本文主要介绍了加速访问Cloudflare的网站的解决方案,希望能对大家有所帮助。通过软件计算得到最快的IP地址的效果图如下图所示,具体解决方案参考下文。 在这里插入图片描述 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

Unity 如何使用命令模式

命令模式 游戏中,当你想通过一种通用的方式来存储命令并能够撤消命令时,那么命令模式最有用。 在“示例”中,你将看到一个可以通过GUI按钮移动的简单点。 采取行动后,您可以撤消并重做。我在屏幕上添加了一个简单的OnGUI标签输出,因此您可以看到命令列表,并指出哪个是当前命令。 在此示例中使用了4个类: Command-这是任何命令模式都可以继承的基本结构(抽象类)。您可以在任何项目中使用此类。 MoveCommand-这是从Command类继承的结构,将使用Execute和UnExecute(撤消)。每个移

TxNet 1556

【C/C++】中【typedef】用法大全

总结一下typedef用法,一共七种,分别是:为基本数据类型起别名、为结构体起别名、为指针类型起别名、为数组类型起别名、为枚举类型起别名、为模版函数起别名。

Bobowen的博客 3409

YOLO26 正式发布源代码!极致速度优化方案, 面向工业级落地的目标检测模型!

YOLO26 作为 Ultralytics 公司于 2025 年 9 月发布的最新一代目标检测模型,在架构设计和技术实现上展现了显著的创新。本文深入分析了 YOLO26 的核心架构改进和技术原理,重点探讨了其在边界框回归、推理流程、损失函数设计和优化算法方面的突破性进展。

魔改工程师的博客 1243

c/c++结构体定义 typedef struct 用法详解和用法小结

本文转载于 https://blog.youkuaiyun.com/mpp_king/article/details/70229150 typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。   typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。   在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新名字(类型有新别名,方便变量的定义),另一个是简化一些比较复杂的

qq_45716607的博客 7953

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[C/C++]宏定义及typedef用法

一.#define基本用法 #include <stdio.h> #include <stdlib.h> //数字和字符串 #define FAMILY "5+2+1:姥爷,爸爸,妈妈,姐姐,我\ +托尼,Coco+肉肉" #define LARRY_AGE 21 //运算 #define SQUARE(x) x*x//× #define XSQUARE(x) (x)*...

ainu412的博客 486

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【C语言】结构体定义 typedef struct 用法详解和用法小结

结构体定义 typedef struct 用法详解和用法小结 文章目录结构体定义 typedef struct 用法详解和用法小结0. 前言1. 首先:在C中定义一个结构体类型要用typedef:2. 其次:在c++中如果用typedef的话,又会造成区别:3. 掌握上面两条就可以了,不过最后我们探讨个没多大关系的问题4. C/C++中typedef struct和struct的用法5. 问答6. 用法小结 0. 前言 typedef是类型定义的意思。 typedef struct 是为了使用这个结构体方

weixin_44948467的博客 4万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

之后,不允许定义任何变量.这是c语言的语法,但是c++是可以的.,C/C++语法知识:typedef struct 用法详解...

第一篇:typedef struct与struct的区别1. 基本解释typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。至于typedef有什么微妙之处,请你接着看下面对几个...

weixin_42363874的博客 333

结构体定义 typedef struct 用法详解和用法小结

typedef可以声明新的类型名来代替已有的类型名,但却不能增加新的类型。  typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。  在编程中使用typedef目的一般有两个,一个是给变量提供一个易记且意义明确的新名字(类型有新别名,方便变量的定义),另一个是简化一些比较复杂的类型声明。typ...

一个人的旅行的博客 15万+

typedef的最新理解

说是新解,其实一点都不新,只是我以前没有学会typedef的真正用法. 但是我感觉应该有些同学没有掌握typedef的用法,所以写出来分享一下. 1.typedef的常规用法 typedef unsigned int UNIT; UINT b; 需要注意的地方有下面几点: ①define 前面替代后面, typedef后面替代前面,这个不要记混了. ②typedef 后...

weixin_30318645的博客 176

结构体定义:struct与typedef struct 用法详解和用法小结

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。  二、#define的用法

haiou0的专栏 5万+

C语言中typedef的详细用法

第一个用法我们经常用到就是和define类似,用于给现有的类型添加一个别名,例如“typedef unsigned int uint16_t;”然后我们如果想声明一个无符号的整形变量,就可以使用"uint16_t i;"来代替''unsigned int i;"。 第二个用法就是可以使一些复杂的声明简化,例如声明函数指针的时候: /*声明函数指针的一般方式,这里以一个返回一个int类型,接受...

qq_40179304的博客 8052

C++中typedef struct和struct的用法

由于对typedef理解不够,因此从网上摘录了一些资料,整理如下: 2. C/C++中typedef struct和struct的用法 4. struct _x1 { …}x1; 和 typedef struct _x2{ …} x2; 有什么不同? 6. 7. 其实, 前者是定义了类_x1和_x1的对象实例x1, 后者是定义了类_x2和_

ljishuboke的博客 717

【C语言】typedef struct node{}a,*b;到底是什么意思?

  很多小伙伴知道 typedef int a;的作用相当于将int 换名为a; 也知道typedef struct node{xxx}b;的意思是将这个结构体命名为b;但是对于这样的代码 typedef struct Node { int value1; int value2; }*p,a; 确不知道这两个表示的什么。首先我们先明确一个typedef最基本的定义 typedef...

qq_35624030的博客 1万+

定义结构体时加typedef和不加typedef的区别

不加typedef时: struct S { int i; }a,b; 相当于定义了结构体S和S的两个变量a,b 加上typedef: typedef struct S { int i; }a,b; 除了定义结构体S,又给该结构体起了别名a和b;a和b位置的标识符就都是别名而不是变量名,a和b也可以像类型一样用来定义结构体变量。因为是起了别名,所以不起结构体名也没问...

WWX2LN的博客 4934

define、typedef、const、typedef struct 用法详解

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,

2442
上一篇: 链接库动态链接库详细介绍
下一篇: c++ 尽量不要使用#define 而是用const、enum、inline替换
流左沙
博客等级 码龄11年 46粉丝 55原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值