Rust 中的宏(macro)和普通函数有以下核心区别,分别从用途、扩展方式、性能影响语法特征等多个方面来解释:


📌 1. 定义方式

项目函数
定义方式macro_rules!macro(新版)fn 关键字
调用方式类似于函数,但结尾是 !(如 println!()常规函数调用,如 foo()

📌 2. 是否发生在编译前

  • 宏是在编译前展开(即代码生成阶段),属于语法扩展。

  • 函数是在编译时处理,属于语义层面的内容。

🔹 也就是说,宏是**"写代码的代码"(元编程)**,它能生成任意的代码。


📌 3. 接受参数的灵活性

  • 宏可以接受任意数量和类型的参数,比如可以写一个 vec![1, 2, 3],其中元素的个数不限。

  • 函数参数必须在定义时确定类型和数量,如 fn add(x: i32, y: i32) -> i32


📌 4. 支持控制语句与语法结构

  • 宏可以生成结构体、模块、甚至实现某个 trait 的代码。

  • 函数只能做语句级的运算,无法控制代码结构的生成。

✅ 举例:

macro_rules! say_hello {() => {println!("Hello!");};
}fn say_hello_fn() {println!("Hello!");
}
  • say_hello!() 是在编译前展开为 println!("Hello!");

  • say_hello_fn() 是在运行时执行


📌 5. 性能差异

  • 宏展开后的代码可以是内联的,性能可能更高(尤其在频繁调用时)。

  • 函数调用会有栈帧压栈和跳转,但现代优化后开销极低

但是,不建议滥用宏来替代函数,维护成本高,错误难以定位。


📌 6. 调试难度

  • 宏展开后的代码不容易调试,编译错误也更难理解。

  • 函数调用的错误通常更清晰、定位更简单。


📌 7. 使用场景对比

场景建议用宏建议用函数
想写 DSL(领域特定语言)✅ 是❌ 否
生成重复代码✅ 是❌ 否
普通逻辑封装❌ 否✅ 是
控制编译结构✅ 是❌ 否

✅ 总结一句话

宏是为了解决不能用函数解决的问题,比如代码生成和语法扩展,而函数是写程序逻辑的主力。能用函数就不要用宏,除非你需要编译期的代码生成能力。


需要我举更复杂的例子,比如自己实现一个 my_vec! 宏、或者对比 println!print_fn 吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88901.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88901.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88901.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Qt C++的影像重采样批处理工具设计与实现

摘要 本文介绍了一种基于Qt C++框架开发的高效影像重采样批处理工具。该工具支持按分辨率(DPI) 和按缩放倍率两种重采样模式,提供多种插值算法选择,具备强大的批量处理能力和直观的用户界面。工具实现了影像处理的自动化流程,显著提高了图像处理效率,特别适用于遥感影像处…

TypeScript 中的 WebSocket 入门

如何开始使用 Typescript 和 React 中的 WebSockets 创建一个简单的聊天应用程序 示例源码:ws 下一篇:https://blog.csdn.net/hefeng_aspnet/article/details/148898147 介绍 WebSocket 是一项我目前还没有在工作中使用过的技术,但我知道…

TMS汽车热管理系统HILRCP解决方案

TMS汽车热管理系统介绍 随着汽车电动化和智能化的发展,整车能量管理内容增多,对汽车能量管理的要求也越来越高,从整车层面出发对各子系统进行能量统筹管理将成为电动汽车未来的发展趋势,其中汽车热管理是整车能量管理的重要组成部…

CCleaner Pro v6.29.11342 绿色便携版

CCleaner Pro v6.29.11342 绿色便携版 CCleaner是Piriform(梨子公司)最著名广受好评的系统清理优化及隐私保护软件,也是该公司主打和首发产品,它体积小、扫描速度快,具有强大的自定义清理规则扩展能力。CCleaner是一款…

不做手机控APP:戒掉手机瘾,找回专注与自律

在当今数字化时代,手机已经成为我们生活中不可或缺的一部分。然而,过度依赖手机不仅会分散我们的注意力,影响学习和工作效率,还可能对身心健康造成负面影响。为了帮助用户摆脱手机依赖,重拾自律和专注,一款…

Go 语言中的接口

1、接口与鸭子类型 在 Go 语言中,接口(interface)是一个核心且至关重要的概念。它为构建灵活、可扩展的软件提供了坚实的基础。要深入理解 Go 的接口,我们必须首先了解一个在动态语言中非常普遍的设计哲学——鸭子类型&#xff0…

在项目中如何巧妙使用缓存

缓存 对于经常访问的数据,每次都从数据库(硬盘)中获取是比较慢,可以利用性能更高的存储来提高系统响应速度,俗称缓存 。合理使用缓存可以显著降低数据库的压力、提高系统性能。 那么,什么样的数据适合缓存…

SLAM中的非线性优化-2D图优化之零空间(十五)

这节在进行讲解SLAM中一个重要概念,零空间,讲它有啥用呢?因为SLAM中零空间的存在,才需要FEJ或固定约束存在,本节内容不属于2D图优化独有,先看看什么是零空间概念;零空间是一个核心概念&#xff…

如何解决本地DNS解析失败问题?以连接AWS ElastiCache Redis为例

在云服务开发中,DNS解析问题常常成为困扰开发者的隐形障碍。本文将通过AWS ElastiCache Redis连接失败的实际案例,详细介绍如何诊断和解决DNS解析问题,帮助你快速恢复服务连接。 引言 在使用 telnet 或 redis-cli 连接 AWS ElastiCache Redis 时,有时会遇到类似以下错误:…

探索钉钉生态中的宜搭:创建与分享应用的新视界

在当今快速发展的数字化时代,企业对于高效协作和信息管理的需求日益增长。作为阿里巴巴集团旗下的智能工作平台,钉钉不仅为企业提供了强大的沟通工具,其开放的生态系统也为用户带来了无限可能。其中,宜搭(YiDa&#xf…

深入理解事务和MVCC

文章目录 事务定义并发事务代码实现 MVCC定义核心机制 事务 定义 什么是事务? 事务是指一组操作要么全部成功,要么全部失败的执行单位。 在数据库中,一个事务通常包含一组SQL语句,系统保证这些语句作为一个整体执行。 为什么引…

用 Python 绘制精美雷达图:多维度材料属性对比可视化全指南

🌟 为什么选择雷达图?从材料科学到多维数据对比的可视化利器 在科研和数据分析领域,当我们需要同时展示多个维度的数据对比时,传统的柱状图或折线图往往显得力不从心。这时候,雷达图(Radar Chart&#xff…

Excel学习03

超级表与图表 Excel中具有超级表的功能。所谓超级表(官方名称为“表格”,快捷键CtrlT)是Excel中一个强大的数据管理工具,它将普通的数据区域转换为具有只能功能的交互式表格。 这就是表格变为超级表的样子。超级表默认具备冻结窗…

Netflix 网飞的架构演进过程、Java在网飞中的应用|图解

写在前面 上一篇文章中,我们讲解了网飞当前的架构,但网飞的架构并不是一开始就是这样的,而是不断演进发展才是当前的样子。 这篇文章我们就来讲讲网飞架构的演进过程。 第一阶段:Zuul Gateway REST API 使用 Zuul 作为API网关…

使用ros2服务实现人脸检测2-人脸检测功能实现(适合0基础小白)

文章目录 一、用到的库二、使用步骤1.引入库2.获取图片真实路径3.检测人脸4.绘制人脸5.显示结果6.更改setup.py7.完整代码 三、结果展示 一、用到的库 face_recognition:实现在图片中检测人脸。 cv2:显示图片,并且可以在图像中展示检测结果。…

中国农村统计年鉴-Excel版(1985-2024年)

《中国农村统计年鉴》系统收录了全国和各省农村社会经济统计数据,以及近年全国农村主要统计数据,是一部全面反映我国农村社会经济情况的资料性年刊。年鉴内容覆盖农村人口结构、农业产值、主要农产品产量、市场物价、进出口贸易以及收入消费水平等社会经…

golang pprof性能调试工具

简介 pprof是性能调试工具,可以生成类似火焰图、堆栈图,内存分析图等。 整个分析的过程分为两步:1. 导出数据,2. 分析数据。

PPIO × 302.AI:三分钟搭建可共享的聊天机器人

最近,各主流模型厂商频频发布新模型,有一如既往强大的DeepSeek-R1-0528,擅长长输入推理的MiniMax-M1-80k…… 好用的AI大模型这么多,如何才能集成在一个应用自由使用呢?302.AI作为企业级AI应用平台支持各主流模型调用&…

怎么样在自己的网站/独立站中添加视频?

文章目录 **前言** 一、视频在网站/独立站的好处二、视频嵌入网站的原理三、如何简易地把视频嵌入到独立站中? 前言 在信息传播形式日益多元化的当下,静态文字与图片早已无法满足用户对沉浸式浏览体验的需求。视频以其动态画面、声音及文字相结合的特性…

【图像处理基石】什么是摄影的数码味?

“数码味”是一个摄影术语,通常指照片看起来不自然,有过度处理的痕迹,比如色彩过于鲜艳、对比度偏高、高光过曝、阴影死黑,或者有明显的锐化痕迹和噪点。这种现象在手机摄影中尤为常见,因为手机相机的自动算法往往会为…