补遗篇之typedef

ARM Cortex-M内核PC=0xFFFFFFFE死锁问题深度解析与实战排查指南 在嵌入式系统开发中,异常处理机制是保障系统稳定性的核心基础。ARM Cortex-M架构通过硬件自动化的异常向量表管理程序流程,当发生非法内存访问、执行无效指令等严重错误时,会触发硬错误(HardFault)。理解异常嵌套与锁死(Lockup)状态的原理,对于诊断系统崩溃至关重要。其技术价值在于,开发者可以通过分析程序计数器(PC)、链接寄存器(LR)及栈内存等关键现场信息,精准定位导致空指针(NULL Pointer)或栈溢出等根本原因。这不仅能快速恢复系统,更能从根本上提升代码的健壮性。本文聚焦于嵌入式 阅读详情

    typedef关键字主要用于为C的固有数据类型定义别名,固有类型包括内部类型(int,char等)和自定义类型(struct,enum等),注意:typedef并不创建新类型,只是为现有类型加同义别名。

typedef与#define区分

    有时#define和typedef有表面类似的功能,正因为如此,更有必要弄清两者的本质差别和适用场合。typedef是为类型定义新别名,而#define是纯粹的字符替换;typedef在正式编译阶段被解析,而#define在早期预处理阶段做替换。用define定义类型,只是typedef的“山寨”版,徒有其表。

    比如用二者分别定义指向结构体s的指针类型:#define dpS struct s*和typedef struct s* tpS;,再用dpS和tpS各自定义两个变量,即dpS p1,p2; 和tpS p3,p4; 结果怎样?dpS p1,p2;展开后变成struct s *p1, p2; 其中p1是指向struct s类型的指针,p2却是一个struct s类型的变量,这明显不符合预想。而tpS定义的p3和p4则都是结构体指针,因为tpS是一个数据类型,支持类似多变量连续定义。

    所以原则上不能用define代替属于typedef的类型重定义工作。但除此之外,define的影响还是阴魂不散。比如原来有如下定义:typedef char *pstr;  int mystrcmp(pstr, pstr); 后来因为发现标准函数strcmp的参数是const char*型,于是程序员想改进函数,也加上const限制,自然改成int mystrcmp(const pstr, const pstr);   但typedef不是define,pstr也不是char*的字符替换,最终const pstr会被解析为char* const(指向char的常量指针),而不是const char*(指向常量char的指针)。为避免歧义,应定义如下:

   typedef const char *cpstr;    int mystrcmp(cpstr, cpstr);

typedef功能一:促进跨平台移植

    在代码里用typedef重定义的类型别名代替C的固有类型(int char等),可以把不同平台间固有数据类型的差异隐藏起来,然后通过编译宏开关选择平台对应的typedef定义。这种利用typedef提高移植效率的技巧在C语言潜规则篇第4节有详细论述。

typedef功能二:定义新名,望词知义,提高可读性

    可以用typedef为现有类型定义有具体含义,易于记忆的类型同名,以更好体现程序员意图,提高可读性。如先typedef int bool和typedef int size,之后所有布尔变量都可以用bool定义,而所有表示大小长度的变量用size定义,这明显比统统用int更有针对性。

typedef功能三:简化复杂语法,提高代码美观性和可读性。

    一些复杂类型如数组和结构体,用typedef还可以简化其变量定义。比如定义相同大小数组时,原先只能char line[10]; char text[10];…… 现在可以先用typedef定义一个别名:typedef char Array10[10]; 之后就可以很方便的定义同类型数组:Array10 line, text……;

    有时typedef简化语法的功能并非可有可无,而是必不可少,如:

    int (*Register(int(*pf)(const char*,const char *)))(const char *, const char *);

    有几个人能很快读懂这行代码?改用typedef实现同样功能后,再比较一下:

    typedef int (*pFun) (const char*,const char*);

    pFun Register(pFun pf);

    这样就变得很清楚,pFun是某函数指针的同名类型,该函数有两个const char*型参数,返回int型。Register()的参数是一个pFun型的回调函数,同时返回pFun型函数的地址。所以typedef可以把复杂语法分解成若干简单定义,对提高代码可读性很有帮助。

小知识

    BTW,C标准规定,typedef在语法属性上类似static/extern/register,归属于存储类关键字。虽然typedef不会真正影响存储属性,但象typedef extern int counter;这种语句就不成立,因为typedef和extern角色重复,不能同时包含多个存储类关键字。

关于C/C++中typedef的定义与用法总结 在C还是C++代码中,typedef都使用的很多,在C代码中尤其是多,typedef与#define有些相似,其实是不同的,特别是在一些复杂的用法上,需要的朋友可以参考下 立即下载

相关推荐

Windows安装WSL子系统及docker,以及WSL和docker配置、使用及问题解决

在Windows操作系统中,Ubuntu子系统(也称为Windows Subsystem for Linux, WSL)为开发者提供了一个在Windows环境下运行Linux环境的平台。然而,有时用户在按照Ubuntu子系统或者使用WSL时,可能会遇到各种问题,下面总结一下解决方式。想要在Windows上安装Docker(实际上是基于Hyper-V或者WSL2这两项虚拟化技术),需要开启虚拟化功能,所以不管是对于系统还是硬件都有一定的要求。

sym的博客 9786

typedef重定义错误

记录一个问题。 Item.h文件: typedef int Item; Link.h文件: #include "Item.h" void LINKinit(int); Link.c文件: #include "stdio.h" #include "Link.h" #inlcude "Item.h" void LINKint(int n) {

wangst4321的专栏 8445

Supermind量化实战:我如何给双均线策略加上“止损”和“仓位管理”,让回测收益更稳健

本文详细介绍了如何在Supermind平台上为双均线策略添加止损和仓位管理模块,以提升量化交易的稳健性。通过Python实现动态止损和智能仓位管理,策略的年化收益率从12.3%提升至15.8%,最大回撤从58.7%降至22.4%,Sharpe比率显著提高。这些实战技巧适用于量化交易爱好者,帮助他们在黑天鹅行情中保持收益稳定。

weixin_42567752的博客 363

第三方C代码移植过程中的typedef重复定义问题

楔子: 本文主要描述了把第三方代码移植到某一目标平台过程中所发生的typedef重复定义的问题。之所以要写这个问题,原因有三:1>这个问题是一个移植代码过程中经常遇到的老大难问题2>我还没有完全(或者说完美的)解决这个问题3>想得到诸位高手的点拨。 首先要看看下面的原

beyondchx的专栏 9081

Ubuntu22.04通过DKMS包安装Intel WiFi系列适配器(网卡驱动)

Ubuntu安装Intel WiFi系列适配器(网卡驱动)

lu_linux的博客 2602

手把手教你配置RK3588的FFmpeg+RKmpp:从解码到RGA转换的完整避坑指南

本文详细介绍了在RK3588平台上配置FFmpeg+RKmpp进行硬件解码和RGA图像处理的完整流程,包括环境准备、DRM Prime解码输出实战、RGA硬件加速转换技巧以及全链路性能调优。通过具体代码示例和问题排查指南,帮助开发者高效实现视频处理流水线,显著提升性能并降低CPU占用率。

weixin_28366475的博客 475

typedef重复定义的一种解决方法

与#define不同,typedef没有类似#undef的方法取消定义,如果两个库中同时使用typedef定义了某个类型,便会编译失败。一个解决方法是,在包含第二个库时使用#define将重复定义的类型名改掉。

baowxz的专栏 1219

CocosCreator 面试题(十七)Cocos creator 固定宽度与固定高度的底层原理是什么?Cocos creator是如何做适配的?

通过固定宽度或固定高度的适配方式,可以使游戏在不同屏幕尺寸上保持一定的一致性,确保游戏中的元素的大小和位置相对稳定。具体选择哪种适配方式取决于你的游戏需求和设计考虑。在 Cocos Creator 中,你可以通过设置「设计分辨率」和使用相对坐标和布局方式来实现固定宽度或固定高度的适配。总之,Cocos Creator 提供了多种适配方式和工具,帮助你在不同屏幕尺寸上保持游戏画面的一致性。在 Cocos Creator 中,固定宽度和固定高度是两种常见的适配方式,用于在不同屏幕尺寸上保持游戏画面的一致性。

w风雨无阻w的专栏 1688

用typedef 将结构体重定义时遇到的问题

Linklist 定义L为二级指针,编译时遇到错误。我没有给结构体命名,所以无法进行声明其它的变量 L;改为 typedef struct list{

m0_54797575的博客 660

【考试大纲】中级多媒体应用设计师考试大纲

中级多媒体应用设计师考试大纲

邓邓子的博客 382

全新YOLOv11一文弄懂 | YOLOv11网络结构解读 、yolov11.yaml配置文件详细解读与说明、模型训练参数详细解析 | 通俗易懂!入门必看系列!

本文全面介绍了YOLOv11目标检测算法,包含网络结构解析、yaml配置文件详解及训练教程。YOLOv11通过改进的C3k2f模块、SPPF和C2PSA注意力机制等创新设计,在COCO数据集上实现了比YOLOv8更优的性能。文章详细解读了yolov11.yaml配置文件的参数设置、主干网络(backbone)和头部网络(head)结构,并提供了完整的训练代码示例和参数说明。训练部分涵盖了模型选择、参数设置及优化技巧,包括epochs、batch size、学习率等关键参数的调整建议。最后总结了YOLOv11

Ai缝合怪、助力小伙伴高效发论文 3万+

补遗篇之struct(enum/union)多种定义方式

结构体(struct)是各种变量组合形成的新数据类型,struct有多种定义形式,总结下来可分四种,初学者容易混淆。下面一并整理区分,其中要特别留意区分三个元素:结构标签名,结构变量名,结构别名。 形式1:     struct 结构标签名     {       类型成员变量名;       ......     }结构变量名; 实例:     struct tagPERSON

半山茶馆 1223

YOLOv10改进策略【模型轻量化】| 替换骨干网络为MoblieNetV2,含模型详解和完整配置步骤

本文记录的是。采用深度可分离卷积将标准卷积分解为深度卷积和1×1卷积。同时,引入来,避免非线性层导致的性能下降问题。本文将应用到YOLOv10中,借助其高效的结构和特性,在保持一定精度的前提下,显著降低YOLOv10的计算复杂度和内存占用。

Limiiiing的博客 533

1117c语言学习补遗

标准输入输出函数 printf 格式 printf(“格式符”,输出列表); 2)格式符 %d %c %u %o %s %e etc 3)修饰符(加在%和格式符关键字之间) m表示输出数字宽度 .n 表示实数的小数位数或字符串指定输出位数 — 左对齐 +显示正号 etc scanf 1)格式 scanf(“格式符”,注入地址列表); 2)消除输入垃圾可以在之后添加 getchar函数; 3)格...

xyc895的博客 271

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

假人有限元模型

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

MC9S08GW64 ADC16差分模式优化校准:提升线性度与工程实践

在嵌入式系统开发中,模数转换器(ADC)的精度直接影响测量系统的性能。ADC通过将模拟信号转换为数字量,其核心原理涉及采样、量化和编码。然而,由于制造工艺和电路非理想性,ADC会引入增益误差、偏移误差以及非线性误差,这些误差在高精度测量场景中尤为关键。为了提升系统性能,校准技术应运而生,它通过修正内部误差来改善ADC的转换精度。在工程实践中,针对特定ADC架构(如SAR型)和特定工作模式(如差分输入),标准校准流程可能无法完全消除非线性尖峰,尤其是在满量程的1/4、1/2和3/4点附近。本文聚焦于飞思卡尔M

weixin_33725515的博客 319

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

typedef/define重复定义的一种解决方法

与#define不同,typedef没有类似#undef的方法取消定义,如果两个库中同时使用typedef定义了某个类型,便会编译失败。 一个解决方法是,在包含第二个库时使用#define将重复定义的类型名改掉。 例如,如果头文件sm_system.h和math.h中均包含"typedef xxxx float_t"语句,那么使用如下的头文件包含方法: #include "sm_system.h" #define float_t ms_float_t #incl...

zhangyikuaile的博客 3545

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

定义typedef struct 重定义错误解决办法

今天在ffmpeg下面编译了一个小例子,主要是对特定格式的视频文件以bmp格式文件保存到本地硬盘,ppm格式已经成功保存,bmp有点麻烦,在定义typedef struct 时,编译出现错误error C2011:'struct' type redefinition,解决办法有2种:1.在所有#include 前加#define WIN32_LEAN_AND_MEAN#define WIN32_LEAN_AND_MEAN#include #include 2.在定义typedef struct 前加 #if

hfeizi的专栏 8515

实用经验 13 typedef使用的陷阱

尽量用typedef实现那些复杂的声明形式。保证你的代码清晰,易于阅读;区分宏和typedef的差异,不要用宏的思维方式对待typedef,因为typedef声明的新名称具有一定的封装性,而#define宏,只是简单的字符替换。

一鸣惊人的博客 711

集成第三方模块编译时类型重定义冲突的解决方法

软件A中需要集成B音频引擎,B引擎库提供两个头文件:B_commontype.h和B_engineAPI.h,B_commontype.h中定义引擎用到的基本数据类型,B_engineAPI.h中include B_commontype.h文件并定义接口函数,接口函数使用B_commontype.h定义的基本数据类型。 在需要使用该引擎库函数的Apply_B.cpp文件中将B_commont

镜头中的艺术 4030

C关于typedef的两个典型错误!

1:对于用户定义类型,typedef与#define的区别: 一个是类型定义(定义一个新的类型),另一个是宏定义(简单的文本替换),一般来说最好使用typedef,部分原因是它能够正确处理指针类型,例如,考虑以下声明: typedef char * string_1; #define string_2 char *; string_1 s1,s2; string_2 s3,s4; s1

B_H_L的专栏 4136

编译第三方库提示typedef重复定义

我看不懂,但我真的好震撼。。。 引自:[轻笔记]多个第三方库typedef重定义冲突 问题描述 工程依赖opencv与课题组项目的一个库,编译时出现以下错误: 大概意思是,两个库里都用typedef定义了int64,发生冲突。 无解之下请教了课题组的c++小王子——建哥。不一会,建哥发我一个链接:Typedef redefinition (C2371) for uint32 in two 3rd-party libraries。问题本质是一样的。 所以,照猫画虎,在冲突的库头文件前后分别加下如下内容,问

guo_lei_lamant的博客 1324

C++中的typedef

C++中的typedef   用途一:   定义一种类型的别名,而不只是简单的宏替换。可以用作同时声明指针型的多个对象。比如: char* pa, pb;                // 这多数不符合我们的意图,它只声明了一个指向字符变量的指针,和一个

ysdaniel的专栏 827
上一篇: 补遗篇之struct(enum/union)多种定义方式
下一篇: C陷阱篇之char的默认符号
ipmux
博客等级 码龄24年 161粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值