首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在其他proc宏中调用proc宏

在其他proc宏中调用proc宏
EN

Stack Overflow用户
提问于 2020-05-18 09:38:55
回答 1查看 884关注 0票数 0

我有一个小的复制项目,无法编译。这个项目可以在这里下载:碰撞。错误是:

代码语言:javascript
复制
error[E0659]: `proc_macro_call` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution)

我在项目中有3个库和1个可执行文件:

  • Lib 1-解析器-解析proc宏调用。
  • Lib 2- proc_two -返回文字字符串作为proc宏调用。
  • Lib 3- proc_one -将宏转发给proc_two (尽管它不依赖于proc_two)。这类似于proc_two,也是一个proc宏。

Proc_one的相关代码:

代码语言:javascript
复制
#[proc_macro_hack]
pub fn one(input: TokenStream) -> TokenStream {
    let parse = parse_macro_input!(input as Parser);
    let r = parse.lit;

    let x = quote! {
        two!(#r) // This is the problem I guess...
    };

    x.into()
}
  • 可执行文件:调用proc_one (提供编译错误)。

相关守则:

代码语言:javascript
复制
use proc_macro_hack::proc_macro_hack;
extern crate proc_one;
extern crate proc_two;

#[proc_macro_hack]
use proc_one::one;
#[proc_macro_hack]
use proc_two::two;

fn main() {
    let hi: &'static str = one!("hi");

    assert_eq!("hi", hi);
}

我不明白为什么可执行文件中的调用是模棱两可的,lib 2和3不相互依赖。这是一个完整的错误:

代码语言:javascript
复制
error[E0659]: `proc_macro_call` is ambiguous (macro-expanded name vs less macro-expanded name from outer scope during import/macro resolution)
  --> src\main.rs:10:1
   |
10 | #[proc_macro_hack]
   | ^^^^^^^^^^^^^^^^^^ ambiguous name
...
14 |     let hi: &'static str = one!("hi");
   |                            ---------- in this macro invocation
   |
note: `proc_macro_call` could refer to the macro defined here
  --> src\main.rs:11:15
   |
11 | use proc_two::two;
   |               ^^^
...
14 |     let hi: &'static str = one!("hi");
   |                            ---------- in this macro invocation
note: `proc_macro_call` could also refer to the macro defined here
  --> src\main.rs:9:15
   |
9  | use proc_one::one;
   |               ^^^
...
14 |     let hi: &'static str = one!("hi");
   |                            ---------- in this macro invocation
   = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-18 13:24:17

根据proc_macro_hack 文档 ,嵌套调用不支持

默认情况下,嵌套调用不受支持,即由proc宏hack宏调用发出的代码不能包含对同一个proc宏hack宏的递归调用,也不能包含对任何其他proc宏hack宏的调用。如果需要支持嵌套调用,请使用proc-宏嵌套。

因此,您标记的代码才是真正的问题:

代码语言:javascript
复制
let x = quote! {
    two!(#r) // This is the problem
};

还有一个建议是“如果您需要对嵌套调用的支持”,应该考虑使用proc-宏嵌套

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61866669

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档