论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
应用中心
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
qidao123.com技术社区-IT企服评测·应用市场
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
rust学习二十.14、RUST宏
rust学习二十.14、RUST宏
滴水恩情
论坛元老
|
2025-4-15 18:14:56
|
显示全部楼层
|
阅读模式
楼主
主题
1766
|
帖子
1766
|
积分
5298
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
毫无疑问,宏是rust中极其重要的存在,只要我们看看一些标准库的代码。本文阐述rust宏相关的若干问题
一、宏的定义和作用
先介绍下宏的劈头和历史,以便读者更能体会。
以下内容来自文心一言天生:
词源与早期寄义
希腊-拉丁词根
"macro"源于希腊语前缀
μακρο-
(
makro-
),意为“大”或“长”。拉丁语继承为
macro-
(如
macro-instruction
),保存“大”的核心寄义。
在英语中,"macro"作为形容词表示“巨大的”(如
macroeconomic
),作为名词则特指盘算机领域的“宏指令”。
早期通用寄义
在非技术领域,"macro"常用于描述大规模事物(如
macro-scale planning
),与“微观”(
micro
)形成标准对比。
盘算机领域的劈头与演变
20世纪50年代:汇编语言的宏指令
背景
:早期盘算机编程依靠汇编语言,重复性任务(如寄存器操作)导致代码冗长。
突破
:IBM 705盘算机(为陶氏化学公司开发)首次引入
宏指令
(
macro-instruction
),允许用简短符号取代复杂指令序列。
1960年代:LISP语言的元编程宏
关键人物
:Timothy Hart在1963年提出在LISP 1.5中添加宏,通过
宏编译器
将高阶语法转换为底层代码。
意义
:宏成为编程语言扩展机制,支持用户自定义语法(如定义领域专用语言DSL)。
1990年代:VBA与办公自动化
转折点
:微软在Office套件中集成VBA(Visual Basic for Applications),使宏进入大众视野。
应用爆发
:用户可通过录制宏自动化Excel公式盘算、Word文档排版等操作,显著提升办公服从。
基本没有什么毛病!
概括下:
1.macro(宏)-劈头于希腊,后拉丁借用,最后是英语用上了。
2.macro的核心意思就是:巨大,宏观(大规模现象之意)
3.在盘算机领域,大体保存了对macro的寄义,例如宏病毒,宏指令
具体到盘算机,可以如许理解:宏或者宏指令就是表达了一大段代码的对象(命令/指令等),表达了有许多代码的意思。
这是一个风俗问题。只要愿意,我们也可以称为:多指令集合,多代码集合。
以是,总结起来,rust宏定义:用于表示一段代码或者条件语句,其构成大概是一段代码,或则大概也没有任何代码。
或者说宏的核心作用就是两个
1.条件编译
2.表示一段代码,有助于简化编程
从这里可以看出rust宏和C++宏的作用极其相似!
二、宏实现原理
从其自用可以看出,其实现原理相当简单:
1.假如是条件编译指令,那么编译器发现后当做条件执行
2.假如表示一段代码,则rust编译器会把指令替换为一段代码(大体是提单,但具体上应该照旧有一些额外的内容)
宏都是在编译的时候起到作用!
三、宏和函数区别
书籍作者为什么要提到这个? 开始的时候我不太明白,直到我看了宏的代码。
宏的代码看起来有点像函数。
这里先总结下rust中宏和函数的区别:
1.宏可不仅仅是一段代码,还可以作为编译条件
2.宏可以接收不同个数参数(或者说不定个数参数),而函数不能
3.宏是在编译环节起作用(编译器会根据宏类型来决定作为编译条件照旧实现一段代码),而函数是在运行时起到作用
四、标准宏
4.1、常见标准宏
表_常见标准宏
[table][tr]
宏名称
功能描述
所属模块/类型
[/tr][tr][td]assert![/td][td]断言表达式为 true,否则触发 panic(常用于单元测试)[/td][td]标准库(测试相关)[/td][/tr][tr][td]assert_eq![/td][td]断言两个值相等,否则触发 panic[/td][td]标准库(测试相关)[/td][/tr][tr][td]assert_ne![/td][td]断言两个值不相等,否则触发 panic[/td][td]标准库(测试相关)[/td][/tr][tr][td]compile_error![/td][td]在编译期天生错误(用于自定义编译时检查)[/td][td]标准库(元编程)[/td][/tr][tr][td]concat![/td][td]连接多个字面量,返回 &'static str[/td][td]标准库(字符串操作)[/td][/tr][tr][td]column![/td][td]返回当前源代码的列号[/td][td]标准库(调试信息)[/td][/tr][tr][td]dbg![/td][td]输出表达式的值和类型(调试工具)[/td][td]标准库(调试相关)[/td][/tr][tr][td]eprint![/td][td]输出到标准错误流(不换行)[/td][td]标准库(I/O 操作)[/td][/tr][tr][td]eprintln![/td][td]输出到标准错误流(自动换行)[/td][td]标准库(I/O 操作)[/td][/tr][tr][td]env![/td][td]获取编译期情况变量(若变量不存在则报错)[/td][td]标准库(情况变量)[/td][/tr][tr][td]file![/td][td]返回当前源代码的文件名[/td][td]标准库(调试信息)[/td][/tr][tr][td]format![/td][td]格式化字符串并返回 String[/td][td]标准库(字符串操作)[/td][/tr][tr][td]include_bytes![/td][td]将文件读取为字节数组(&'static [u8])[/td][td]标准库(文件操作)[/td][/tr][tr][td]include_str![/td][td]将文件读取为字符串(&'static str)[/td][td]标准库(文件操作)[/td][/tr][tr][td]line![/td][td]返回当前源代码的行号[/td][td]标准库(调试信息)[/td][/tr][tr][td]macro_rules![/td][td]定义声明式宏(如 vec!)[/td][td]标准库(宏定义)[/td][/tr][tr][td]module_path![/td][td]返回当前模块的路径[/td][td]标准库(调试信息)[/td][/tr][tr][td]option_env![/td][td]安全获取编译期情况变量(返回 Option
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
滴水恩情
论坛元老
这个人很懒什么都没写!
楼主热帖
体系集成商重返黄金年代
SFSafariViewController 加载的网页与 ...
ubuntu 20.04 安装好搜狗输入法无法输 ...
聊聊 C# 和 C++ 中的 泛型模板 底层玩 ...
Linux 进程概念 (上)
nsenter命令简单介绍
Kali Linux全网最细安装教程
未来数据库需要关心的硬核创新 ...
GIS数据获取:景象数据免费下载网站 ...
Spark快速上手(2)Spark核心编程-RDD简 ...
标签云
渠道
国产数据库
集成商
AI
运维
CIO
存储
服务器
快速回复
返回顶部
返回列表