为什么 proc-macros 必须在 proc-macro crate 中定义?
Why do proc-macros have to be defined in proc-macro crate?
我试图为我的特征创建一个派生宏,以简化一些事情。
我遇到了一些问题:
the #[proc_macro_derive]
attribute is only usable with crates of the proc-macro
crate type
并且,在小修复之后 proc-macro=true
:
proc-macro
crate types cannot export any items other than functions tagged with #[proc_macro_derive]
currently
functions tagged with #[proc_macro_derive]
must currently reside in the root of the crate`
这种行为的原因是什么?
过程宏与代码中的普通依赖项有着根本的不同。一个普通的库只是链接到你的代码中,但是一个过程宏实际上是一个编译器 plugin.
考虑 cross-compiling 的情况:您正在 Linux 机器上工作,但正在构建 WASM 项目。
- 一个普通的 crate 将是 cross-compiled,生成 WASM 代码并与其余的 crate 链接。
- A proc-macro crate 必须本地编译,在本例中为 Linux 代码,与当前编译器运行时(稳定版、测试版、夜间)链接,并在编译时由编译器本身加载实际使用它的板条箱。它将不会链接到其余的板条箱(不同的体系结构!)。
而且由于编译流程不同,包类型也必须不同,这就是为什么需要proc_macro=true
。
关于此限制:
proc-macro
crate types cannot export any items other than functions tagged with #[proc_macro_derive]
好吧,由于 proc-macro crate 是由编译器加载的,没有链接到您的其他 crate,因此您从这个 crate 导出的任何非 proc-macro 代码都将无用。
请注意,错误消息并不准确,因为您还可以使用 #[proc_macro]
.
导出函数 tagget
关于其他限制:
functions tagged with #[proc_macro_derive]
must currently reside in the root of the crate
目前不支持在嵌套模块中添加 proc_macro
或 proc_macro_derive
项目,并且似乎不是特别有用,恕我直言。
我试图为我的特征创建一个派生宏,以简化一些事情。
我遇到了一些问题:
the
#[proc_macro_derive]
attribute is only usable with crates of theproc-macro
crate type
并且,在小修复之后 proc-macro=true
:
proc-macro
crate types cannot export any items other than functions tagged with#[proc_macro_derive]
currently functions tagged with#[proc_macro_derive]
must currently reside in the root of the crate`
这种行为的原因是什么?
过程宏与代码中的普通依赖项有着根本的不同。一个普通的库只是链接到你的代码中,但是一个过程宏实际上是一个编译器 plugin.
考虑 cross-compiling 的情况:您正在 Linux 机器上工作,但正在构建 WASM 项目。
- 一个普通的 crate 将是 cross-compiled,生成 WASM 代码并与其余的 crate 链接。
- A proc-macro crate 必须本地编译,在本例中为 Linux 代码,与当前编译器运行时(稳定版、测试版、夜间)链接,并在编译时由编译器本身加载实际使用它的板条箱。它将不会链接到其余的板条箱(不同的体系结构!)。
而且由于编译流程不同,包类型也必须不同,这就是为什么需要proc_macro=true
。
关于此限制:
proc-macro
crate types cannot export any items other than functions tagged with#[proc_macro_derive]
好吧,由于 proc-macro crate 是由编译器加载的,没有链接到您的其他 crate,因此您从这个 crate 导出的任何非 proc-macro 代码都将无用。
请注意,错误消息并不准确,因为您还可以使用 #[proc_macro]
.
关于其他限制:
functions tagged with
#[proc_macro_derive]
must currently reside in the root of the crate
目前不支持在嵌套模块中添加 proc_macro
或 proc_macro_derive
项目,并且似乎不是特别有用,恕我直言。