IT评测·应用市场-qidao123.com技术社区
标题:
rust学习二十.14、RUST宏
[打印本页]
作者:
滴水恩情
时间:
2025-4-15 18:14
标题:
rust学习二十.14、RUST宏
毫无疑问,宏是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
欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/)
Powered by Discuz! X3.4