过程宏的代码会在编译阶段先编译成 dll,然后在后续编译其他代码时,rust 编译器会装载这个 dll 并使用内部的函数去预编译其他代码。 正因如此,过程宏的 build 是以一个独立的 dll (或者 so)存在的,所以实现一个过程宏的代码必须在一个独立的 rust 的 lib 类型的项目中实现,且该项目不能存在main。 正因为过程宏的代码独立
熟练写「声明式宏」对理解「过程宏」很有帮助,建议学习「过程宏」之前先学习好「声明式宏」 写宏的时候多多参阅The Rust Reference, 可以更深入地理解 Rust 语言 在学习过程中,使用proc-macro2,syn和quote之前,建议先尝试用 Rust 标准库代码实现,这样可以更好的理解这几个库 写宏的过程会强迫你对 Rust 语言的...
但这篇文章只讲stable rust里的过程宏,如果想了解nightly rust的过程宏,可以去看maud和Rocket,前者是一个HTML模板引擎,大量使用了过程宏,模板都是编译时生成,所以性能非常高,而后者是一个web framework,rust各种黑魔法使用的集大成者。 proc-macro(function-like,类函数宏) 这种过程宏和标准宏很类似,只是构建过程不...
File: rust/library/proc_macro/src/bridge/fxhash.rs 在Rust源代码中,rust/library/proc_macro/src/bridge/fxhash.rs文件是proc_macro库中的一个模块,主要提供了与哈希相关的功能。 该文件中定义了一个名为FxHasher的结构体实现。FxHasher是一个自定义的哈希器,它采用了一种叫做"Fowler-Noll-Vo" (FNV) 的...
Rust过程宏系列教程 | Proc Macro Workshop 之 Debug (上篇) 在Rust编程语言中,过程宏(proc-macro)是一种强大的元编程工具,允许开发者在编译时执行自定义的代码生成任务。这些宏可以扩展Rust的语法,使得开发者能够以更简洁、更直观的方式编写代码。然而,由于过程宏的复杂性,它们的使用和学习曲线都相对陡峭。为了解...
然后我来看quote,quote这个库提供了一些工具用于将rust语法转换为TokenStream,使得用户在编写derive宏的时候可以使用类似macro_rule的方式,以下是该库提供的宏和traits: 同样很基础的英文,应当也是无需翻译的(对吧) 最后是syn,之所以将其放在最后,是该库依赖于上述两个库,加之其本身也比另外两个库复杂许多 ...
这时候 Rust 里面有一个更加灵活的操作,称之为过程宏(proc macro)。过程宏的操作,就相当于操作 Rust 的语法树,在编译期间把tokenstream解出来,加上一些东西,然后再转成tokenstream让编译器继续编译修改后的源码,这种写法对人更加友好,也更加美观。 代码分享 ...
(proc_macro_span_shrink #87552) 创建一个直接指向此跨度之后的空跨度。source pub fn join(&self, other: Span) -> Option<Span> 🔬This is a nightly-only experimental API. (proc_macro_span #54725) 创建一个包含 self 和other 的新跨度。 如果self 和other 来自不同的文件,则返回 None。
| ^^^notfoundinthis scope For more information about thiserror, try `rustc--explain E0425...
在Rust中,编写过程宏,必须在Cargo.toml中设置[lib]proc-macro = true,这样就导致该库只能用于编写过程宏代码,无法在其他库中编写proc-macro代码,比如在其他包中无法使用use proc_macro::TokenStream;,这样就很难对宏代码进行单元测试。 所以第三方提供了proc-macro2这样的包,可以在任何库类型中编写过程宏代码逻辑,...