在宏里访问结构体的成员 - rust

11_Rust中的结构体 因为学Rust的同学基本都是从C/C++过来的所以,对于Rust中的结构体就不用讲得太细,因为基础内容都是差不多的,只是有一些地方会有小小的区别。在前面数据类型的时候介绍过元组,在C++的泛型那块也有元组的出现,如果要追溯到C语言的层次的话,结构体才是复杂数据类型的鼻祖。在复杂数据类型这块,一切都是从C开始演化过来的,包括像C++的类,Java的类也是从C语言的结构体开始。 阅读详情

目前在rust的宏里直接访问结构体的成员是不可行的,但是可以通过变通的方法来做

例如下面的代码就是不可行的,$m.id或者$m.code会提示出错

macro_rules! msg {
    ($id:expr,$code:expr,$f:ident,$m:ident)=>{
        if $id == $m.id && $code == $m.code {
            ...
        }
    }
}

因为宏里可以访问全局函数,所以可以曲线来访问结构体成员
这些全局函数加上了inline,理论上这个曲线方法和直接访问结构体成员的性能是一样的


#[derive(Debug)]
struct Event{
    hwnd: usize,
    msg: u32,
    r: u32,
    wparam: usize,
    lparam: usize,
}

impl Event{
    #[inline(always)]
    fn get_id(&self)->u16 {
        (self.wparam & 0xFFFF) as u16
    }

    #[inline(always)]
    fn get_code(&self)->u16{
        ((self.wparam >> 16) & 0xFFFF) as  u16
    }

    #[inline(always)]
    fn set_result(&mut self,r:u32){
        self.r=r;
    }
}

macro_rules! msg {
    ($id:expr,$code:expr,$f:ident,$e:ident)=>{
        if $id == Event::get_id($e) && $code == Event::get_code($e) {
            $f($e);
        }
    }
}

fn bar(e: &mut Event){
    e.set_result(300);
    println!("{:?}",e);
}

fn foo(e: &mut Event){
    msg!(100,200,bar,e);
}

fn main(){
    let mut e = Event{hwnd:0,msg:0,r:0,wparam:0xc80064,lparam:0};
    foo(&mut e);
}

play网址:https://play.rust-lang.org/?gist=454b5441c1db5dc6a1e1&version=stable
运行结果:Event { hwnd: 0, msg: 0, r: 300, wparam: 13107300, lparam: 0 }

【Rust结构体】Rust结构体详解:从基础到高级应用 结构体(struct)是Rust中一种自定义数据类型,它允许你将多个相关的值组合在一起,形成一个有意义的组。结构体是创建更复杂数据类型的基础,也是面向对象编程中"对象"概念的基石。 与元组类似,结构体的每个部分可以是不同类型。但与元组不同,结构体需要为每个部分命名,这使得数据访问更加清晰明确。 阅读详情

相关推荐

Rust语言中的宏

2010年9月1日,Rust编程语言正式发布,这个由 Mozilla、Dropbox 和其他一些企业领导开发的开源系统级编程语言已经吸引了越来越多的开发者和公司投入到其项目中进行尝试。相对于C/C++或者Java这样传统的编译型语言而言,Rust提供了一种全新的编程模型——安全的并发和高效的内存管理机制,让开发者能够在不破坏性能的前提下实现更复杂的功能。但是Rust作为一门新兴的语言,它的学习曲线较陡峭,并且由于没有经过完整的教育或培训机构的支持,很多开发者都会产生一些误区,甚至出现一些奇怪的问题。

AI天才研究院 2886

一种用宏来简单获取结构体成员变量的方法

一种用宏来简单获取结构体成员变量的方法 #define MEM_OFFSET(TYPE,MEMBER) ((size_t)&((TYPE*)NULL)->MEMBER) 这里实际上一个空指针或者说指针地址为0,而取的某个成员变量的地址减去基地址(0),也不是偏移量 ...

u013765717的博客 1048

RAG-Anything 实战指南:从零构建企业级多模态知识库

本文是RAG-Anything的实战指南,详细介绍了如何从零构建企业级多模态知识库。通过一体化框架,它能无差别解析文本、表格、图片、公式等多格式文档,并构建可深度理解和智能检索的知识图谱。指南涵盖了环境搭建、核心实战、智能查询及生产级部署优化,帮助企业将杂乱文档转化为智能知识大脑。

pandas7gardener的博客 243

Rust从入门到暴走(10)--- Rust的结构体Struct

结构体的定义使用struct关键字,后跟结构体的名称,以及一对大括号{}内包含成员变量的定义。age: u32,上面的代码定义了一个名为Personnameage和is_male,分别表示姓名、年龄和性别。

Luca的博客, 网络安全Hacker,人工智能AIer,区块链Web3er,全栈软件开发er 618

车机破解避坑指南:为什么你的CarPlay盒子不识别?从USB设备ID解析兼容性问题

本文深入解析车机USB设备兼容性问题,特别是CarPlay盒子不识别的原因,从硬件ID到识别机制全面剖析。通过ADB工具和root权限操作,提供详细的破解方案和兼容性测试结果,帮助用户解决车机与第三方设备的连接问题。

weixin_29175469的博客 602

Frida实战:如何用adb快速连接网易mumu模拟器进行参数Hook(附常见CPU架构问题排查)

本文详细介绍了如何使用Frida和adb快速连接网易MuMu模拟器进行参数Hook,包括环境配置、架构适配、Frida-server部署及常见问题排查。特别针对CPU架构兼容性问题提供了实用解决方案,帮助开发者高效完成逆向调试任务。

weixin_29274969的博客 290

Linux下offsetof与container_of结构体

转载:http://www.cnblogs.com/skywang12345/p/3562146.html Linux中的两个经典宏定义 倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生。这两个宏最初是极客写出的,后来在Linux内核中被推广使用。 1. offsetof 1.1 offsetof介绍 定义:offs...

richu123的专栏 1045

别再被systemd-resolved坑了!银河麒麟V10下用Bind9搭建内网DNS的完整避坑指南

本文详细介绍了在银河麒麟V10和Ubuntu系统下部署Bind9 DNS服务器时,如何解决与systemd-resolved的端口冲突问题。提供了五种专业级解决方案,包括彻底禁用systemd-resolved、智能端口转发等,并特别针对银河麒麟V10的安全加固需求给出了配置建议和诊断工具,帮助用户高效搭建内网DNS服务。

weixin_30342209的博客 656

定义宏时千万不要把宏的“参数名”和宏中用到的结构体成员名相同!

C语言中的宏非常强大,可以利用宏来一些要经常用到的操作封装在一起,或者有时仅仅只是让代码看起来更整洁些,但是宏是没有类型检查的,所以使用时千万要小心。但是有时也可以利用宏的没有类型检查这个特性,实现一些特殊的需求。举个简单的例子来说,下面的两个函数:int conf_add_fd(conf_snd_t *conf_snd, int fd) { fd_snd_t *fd_snd =

Justlinux2010的专栏 3308

关于影响力最大化问题中贪心算法的一些理解

在影响力最大化问题中(Influence Maximization,以下简称IM),贪心算法是最早提出的一种解决方法,并且一直沿用至今。它基于IM问题所具有的单调性(Monotonicity)和子模性(Submodularity)使用一种Hill Climbing策略,不断使用Monte Carlo模拟来寻找在当前情况下的具有最大传播范围的节点,添加至种子集合,得到最终结果,算法伪代码如下所示: 这里算法1其实并没有使用MonteCarlo模拟,而只是使用了贪心的策略...

nianjuan1990的专栏 2852

YOLOv5入门实践(1)——手把手带你环境配置搭建

YOLOv5入门实践第一步,手把手带你配置环境

路人贾的博客 2万+

宏、结构体、枚举

宏、结构体、枚举 宏 为什么要使用宏  提高代码的可读性和可维护性  避免函数调用,提高程序效率 什么是宏 它是一种预处理器指令,在预编译阶段将宏名替换为后面的替换体 。 宏的定义 由三部分组成 #define WIDTH 960 预处理指令 宏名 替换体(多行可用 \ 延续) 宏定义的使用 \1. 不带参数的宏 \2. 在宏中使用参数 (请注意一下的区别: #define SQUARE(x) (x)*(x) #define SQUARE(x)

qq_44695317的博客 352

Unity-RetargetPro3-动画插件试用

一个名气大于实战的插件。

大话程序员 711

Rust宏系列教程—自定义派生宏

我们介绍了宏及其分类等基础知识,以及编写宏常用的依赖包等相关内容。在本节中,你将学习如何编写派生宏。我们通过实际示例由浅入深进行,让你逐步掌握自定义派生宏。

neweastsun的专栏 1591

《Autosar_BSW高阶配置》总目录_培训教程持续更新中...

目录 一、Autosar COM Module 二、Autosar BswM Module 三、Autosar EcuM Module 四、Autosar DCM Module 五、Autosar DEM Module 六、其它Module陆续推出 欢迎大家订阅《Autosar_BSW高阶配置》专栏(可以理解为是Autosar培训教程),该专栏每周至少更新一篇,一次订阅,不再二次收费,献上常用的案例和配置方法。下方整理了相关博文的链接(单击蓝色字体即可跳转),方便大家获取。 本专栏...

「汽车电子助手」的博客 4万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

《Rust语言圣经》Rust教程笔记12:2.Rust基础入门(2.4复合类型)2.4.2Rust结构体(结构体更新..、元组结构体、单元结构体、结构体数据所有权、{:#?}打印结构体、dbg!宏)

通过关键字struct定义一个清晰明确的结构体名称几个有名字的结构体字段该结构体名称是User,拥有 4 个字段,且每个字段都有对应的字段名及类型声明,例如username代表了用户名,是一个可变的String类型。为了使用上述结构体,我们需要创建User结构体的实例。

Dontla的博客 1329

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据

本章节讲解一种自定义数据类型:结构体,它允许将多个相关的值打包在一起命名,如果你熟悉面向对象语言,那么结构体就像类一样。主要教材参考 《The Rust Programming Language》要定义结构体,使用关键字 struct 并为结构命名。结构体的名称应该描述组合在一起的数据的重要性。另外打括号包括起来的数据名称和类型,我们称之为字段。例子:user 结构定义以上就是今天要讲的内容本章我们讲解了如何定义结构、如何使用结构、如何定义方法、关联函数等。

小嘉丶学长的博客 3604

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Rust-结构体

我们定义一个结构体Rectangle​ ,这个结构体表示的是一个矩形,它有着 width 和 height 两个元素(字段)。我们现在要给这个结构体专门定义一个“方法”,用以计算矩形的面积。当我们为一个给定的结构体定义方法时,需要添加impl​关键字,也就是在impl块​中编写结构体的一些方法。另外,一个结构体可以有多个impl块​存在。在下面的代码中,我们给Rectangle​ 结构体上成功定义了area​ 方法,用来计算矩形的面积。

日拱一卒无有尽,功不唐捐终入海 1589

如何在结构体里面套结构体_Rust 学习笔记-13 Rust 结构体

什么是结构体数组用于表示值的同构集合。类似地,结构体是Rust中另一个用户定义的数据类型,它允许我们组合不同类型的数据项,包括另一个结构体。结构体将数据定义为键值对.定义一个结构体struct 关键字用于声明结构体。由于结构体是静态类型的,因此结构体中的每个字段都必须与数据类型相关联。结构的命名规则和约定类似于变量。结构块必须以分号结尾.语法如下:struct Name_of_structure ...

weixin_39561431的博客 1824

Rust和golang之结构体

Rust 创建 元祖结构体 类单元结构体 方法 写入方法 关联函数 golang 结构体声明 匿名结构体 嵌套匿名域 方法 空结构体Rust创建Rust 定义结构体也是以struct关键字开头#[derive(Debug)] struct Rectangle { length:u32, width:u32, user:String, }上面我们定义了结构体Rectangle,

KingEasternSun的专栏 1875

Rust结构体

另外定义的方法还可以与成员变量同名,当一个结构体存在同名的成员变量与方法时编译器在检测时如果在调用这个名的后面加上括号时,就认为调用的是方法,当未加括号则认为调用的是成员变量。Rust 中的结构体与其他语言中的定义一样,这是一种自定义的数据类型,用来组织多个相关的值,这些被放在结构体里的值就被称为字段(field),当然按以前的习惯还是叫成员变量更顺嘴。**这也是 Rust 结构体和C++中最大的区别,Rust 的结构体只是一段数据,而不是像C++或者Java中的对象那样的概念。

只为龙舞的博客 1063

【Rust】005-Rust 结构体

/ 定义一个元组结构体,用于表示二维向量// 为Vector2D实现Add特征,实现向量相加功能// 向量1// 向量2// 向量相加println!// 定义一个结构体 Rectangle,用于表示矩形width: u32, // 矩形的宽度,类型为 u32height: u32, // 矩形的高度,类型为 u32// 为结构体 Rectangle 实现方法// 定义一个方法 area,用于计算矩形的面积。

訾博(ZiBo)的博客 1341

Rust的结构体类型的使用

结构体让你可以创建出在你的领域中有意义的自定义类型。通过结构体,我们可以将相关联的数据片段联系起来并命名它们,这样可以使得代码更加清晰。在 impl 块中,你可以定义与你的类型相关联的函数,而方法是一种相关联的函数,让你指定结构体的实例所具有的行为。但结构体并不是创建自定义类型的唯一方法:让我们转向 Rust 的枚举功能,为你的工具箱再添一个工具。

ylh的博客 1221

Rust结构体讲解学习,以及impl结构体方法和结构体关联函数

found: u32注意:如果你常用 C/C++,请记住在 Rust 里 struct 语句仅用来定义,不能声明实例,结尾不需要;符号,而且每个字段定义之后用 , 分隔。

1757

详解Rust结构体struct用法

Rust的结构体(struct)是一种自定义的数据类型,允许开发者命名和包装多个相关的值,以形成有意义的数据组合。在Rust中结构体不仅用于数据组织,还密切结合了Rust的内存安全性和所有权模型特性,在开发系统编程过程中很有用。

yang1fei2的博客 1836

聊一聊Rust的结构体

聊一聊Rust的结构体 因为最近在接触rust语言,所以随便记录下学习过程中遇到的一些有意思的点。实际上结构体在很多语言中都存在。rust的结构体和c/c++语言的结构体其实也是非常类似的。假如我们要定义一个存储帐号信息的结构体 struct User { username: String, email: String, sign_in_count: u64, ac...

readlnh的博客 6464
上一篇: AsRef模拟Atl里的继承关系
下一篇: IAR Error Pe706
varding
博客等级 码龄17年 115粉丝 116原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值