在 rust 各个模块文件中使用宏程序
在本文中,我们将学习如何在 rust 中跨模块文件使用宏。
rust 宏
rust 提供了很好的宏支持。例如,通过宏启用的元编程涉及编写编写其他代码的代码。
宏
提供与函数相当的能力,但没有相关的运行时成本。由于宏
在编译时扩展,因此构建时间成本是相关的。
rust 宏与 c 宏有很大不同。例如,rust 宏应用于标记树,而 c 宏替换文本。
语法:
*macrorulesdefinition*:
`macro_rules``!`[identifier]*macrorulesdef*
macrorules:
macrorule(;macrorule)*;?macrorule:
macromatcher=>macrotranscriber
rust 中跨箱子的宏
crate
包括模块范围的层次结构。crate 中的任何对象都有一个规范的模块路径,指示其在模块树中的位置。
在这个树的顶层,有一个匿名模块。rust 源文件指定了一个模块,其名称和在当前 crate 的模块树中的位置是外部定义的:或者通过引用源文件中的显式 module
项。
它也可能是板条箱本身的名称。每个源文件都是一个模块。
然而,并不是每个模块都需要它的源文件:模块定义可以在单个源文件中分层。
板条箱 util
:
#[macro_export]macro_rules!foo{()=>()}
板条箱用户
:
useutil::foo;foo!();
请注意,使用此策略时,宏始终位于 crate 的顶层。即使 foo
包含在 mod bar
中,user
crate 仍然必须写 use util::foo;
而不是使用 util::bar::foo;
。
你可以使用 pub use
从 crate 的模块中导出宏。
rust 中同一个 crate 中的宏
foo::bar!();mod foo{macro_rules!bar{()=>()}pub(crate)usebar;}foo::bar!();
宏可以通过 pub use
导入并用作任何其他对象。与旧方法不同,这不依赖于源代码顺序,因此你可以在宏编写之前使用它。
每个宏
都有一个名称和一个或多个规则
。每个规则由两部分组成:一个匹配器,它描述它匹配的语法,一个转录器,它描述将被成功匹配的调用替换的语法。
分隔符必须包含匹配器和转录器。表达式、语句、特征、实现、外来项、类型和模式可以通过宏进行扩展。
转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处
本文地址:
相关文章
发布时间:2024/02/05 浏览次数:134 分类:编程语言
-
本教程是关于 rust 中 rc::clone(&rc) 和 rc.clone() 之间的区别。
发布时间:2024/02/05 浏览次数:107 分类:编程语言
-
rust 有一个 & 符号特性,可用于在代码中的任何位置使任何变量可变或不可变。
发布时间:2023/03/21 浏览次数:269 分类:编程语言
-
这个简短的教程演示了如何使用 rust 中的 abs() 函数获取绝对值。
发布时间:2023/03/21 浏览次数:205 分类:编程语言
-
本教程演示了在 rust 结构中初始化变量的简短方法。
发布时间:2023/03/21 浏览次数:148 分类:编程语言
-
本教程演示了在 rust 中克隆 arc 时会发生什么。
发布时间:2023/03/21 浏览次数:223 分类:编程语言
-
本教程演示了在不同版本的 rust 中读取和写入文件的方式。
发布时间:2023/03/21 浏览次数:140 分类:编程语言
-
本教程是关于 rust 中 rc::clone(&rc) 和 rc.clone() 之间的区别。
发布时间:2023/03/21 浏览次数:242 分类:编程语言
-
本教程演示了 rust 的逐步交互式调试器。
发布时间:2023/03/21 浏览次数:374 分类:编程语言
-
本教程是关于使用 rust-image 以程序方式生成图像的。