首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >一个过程宏可以作为一个函数来调试吗?

一个过程宏可以作为一个函数来调试吗?
EN

Stack Overflow用户
提问于 2020-08-05 20:21:42
回答 1查看 824关注 0票数 2

我正在尝试在我正在使用的库中调试一个复杂的过程宏。

由于我不能使用带有宏的调试器,而且各种宏扩展工具在这里被证明是无用的,所以我正在寻找一种替代方法。

一个过程宏是否可以像函数一样运行,并进行适当的调试?我设想将结果proc_macro::TokenStream存储在变量中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-06 09:05:54

proc-macro2 crateproc_macro的替代物,只是它可以在宏之外使用,这使得它具有可测试性。它的类型都可以与proc_macro类型相互转换,并具有相同的方法。

编写非平凡宏的通常模式是只对入口点使用proc_macro,在所有实际工作中使用proc-macro2

代码语言:javascript
运行
复制
extern crate proc_macro;
use proc_macro2::TokenStream;

#[proc_macro]
pub fn my_macro(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
    let output = transform_stream(TokenStream::from(input));
    proc_macro::TokenStream::from(output)
}

// A testable function!
fn transform_stream(input: TokenStream) -> TokenStream {
    // actual work goes here
}

proc-macro2导入项是很常见的,这样就可以使用非限定项,并且只使用proc_macro的完全限定名,因为您将使用它的唯一时间是在入口点。通常也会将核心组件放在一个单独的库机箱中,它不依赖于proc_macro

在测试中,可以从字符串创建TokenStream

代码语言:javascript
运行
复制
use std::str::FromStr;
let ts = TokenStream::from_str("fn foo() {}").unwrap();
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63272964

复制
相关文章

相似问题

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