过程宏可以作为函数进行调试吗?

2024-01-18

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

由于我无法将调试器与宏一起使用,并且各种宏扩展工具已被证明在这里毫无用处,因此我正在寻找替代方案。

程序宏可以像函数一样运行并进行适当的调试吗?我想象存储结果proc_macro::TokenStream在一个变量中。


The proc-macro2 crate https://crates.io/crates/proc-macro2是一个简单的替代品proc_macro除了它可以在宏之外使用 - 这使得它可以测试。它的类型都可以与proc_macro类型并具有相同的方法。

编写重要宏的通常模式是使用proc_macro仅作为入口点,并使用proc-macro2对于所有实际工作:

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来自字符串:

use std::str::FromStr;
let ts = TokenStream::from_str("fn foo() {}").unwrap();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

过程宏可以作为函数进行调试吗? 的相关文章

随机推荐

  • 设置 TCP/IP 客户端和服务器通过网络进行通信

    我正在尝试学习一些有关套接字编程的知识 并且偶然发现了 TcpListener 和 TcpClient 来使用 因为我读到它们对于初学者来说稍微容易一些 我想要完成的基本要点是拥有一个可以在我的笔记本电脑和同一网络上的另一台笔记本电脑上运行
  • 对 pandas 数据框进行子集化的最佳方法[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 嘿 我是 Pandas 新手 我刚刚遇到df query 为什么人们会使用df query 什么时候可以使用括号表示法直接过滤数据框 panda
  • 如何在 JavaScript 中添加 HTML 标签?

    我想在我的 javascript 中使用一个 html 标签 但不知道如何使用它 For ex p An absolute URL a href https www w3schools com W3Schools a p 这是我的标签 我想
  • 如何使用 C++ 发出 HTTP 请求?

    有没有办法用C 轻松发出HTTP请求 具体来说 我想下载一个页面 API 的内容并检查内容是否包含1或0 是否也可以将内容下载到字符串中 我有同样的问题 libcurl http curl haxx se libcurl 真的很完整 有一个
  • DetectionAPI 仅支持单声道 Wav

    我正在开发一个拍手检测 Android 应用程序 我在用musicg https github com madyx musicgapi 用于此 我从github导入了该项目并在android设备上运行 然后这个错误显示 DetectionA
  • Memcache 错误:无法从流 (0) 数组读取行

    当我们的服务器承受任何重大负载时 我会收到以下错误的一些变化 我已经在谷歌上搜索了几个小时并尝试了一切 包括升级到最新版本和全新安装 我已经阅读了 SA 上所有关于它的帖子 但无法弄清楚 很多人都有同样的问题 但似乎没有人有明确的答案 任何
  • Ga特林 j.n.ConnectException:地址已在使用中

    当使用 Ga特林运行模拟时 我遇到以下异常 j n ConnectException 地址已在使用中 没有更多信息 当测试的服务器无法响应或超时时是否会发生这种情况 我想确保这是服务器抛出的异常 而不是客户端抛出的异常 我在 Windows
  • AWS 负载均衡器连接到同一服务器上的多个端口,无需 PAT

    我有一个 EC2 Web 服务器 它提供一个侦听端口 80 8080 443 和 8443 的应用程序 外部客户端需要在这些端口上与其通信 无端口转换 我试图将其放在负载平衡器后面 但过多的所需端口让我感到困惑 我有一个 ALB 监听 4
  • 当 NFS 挂载失败时,bash 检查目录是否存在挂起

    我有一个 bash profile 脚本 它根据目录存在为我设置一些别名 if d home user games then alias cdgames cd home user games fi 这些目录之一位于 NFS 挂载上 如果文件
  • 如何在 JSON Schema 中制作二维数组?

    下面的二维数组怎么写JSON 架构 http json schema org 网格固定为16 13 它包含完全空的行或具有 int 0 99 或空字符串等值的行 这是数组的示例 94 78 37 78 61 71 42 82 53 62 6
  • PyObjC + Xcode 3.2 + 非 Apple Python

    我想开始尝试使用 PyObjC 开发一些简单的应用程序 我安装了 PyObjC 和 Xcode 模板 我知道 PyObjC 本身可以工作 因为我已经运行了这个脚本 http svn picidae net trunk pici server
  • 从二进制文件中删除 protobuf C++ 编译的路径字符串

    当我编译使用 Protobuf 的 C 程序 然后运行 linux 时strings二进制文件上的命令 其中一个字符串是生成的路径cc文件 包含我的主目录和所有内容 显然 我想从二进制文件中删除我的主目录和其他个人信息 该路径从何而来以及如
  • c 中 qsort() 函数中的 cmpfunc

    有人可以解释一下吗cmpfunc这是用在qsort功能 什么是a and b在这个函数中 它们指向什么 int cmpfunc const void a const void b return int a int b a and b in
  • 如何在 Django 中使用 Pusher?

    我正在尝试使用 Pusher 和 django 构建一个应用程序 我浏览了一些链接 例如https github com pusher django pusherable https github com pusher django pus
  • 删除 Android Gallery 小部件中的边框?

    如何去除图库图像周围丑陋的灰色边框 在 ImageAdapter 中排除此行以停止加载该预设 imageBackground ta getResourceId R styleable Gallery1 android galleryItem
  • 为什么 jsessionid 附加到每个 url 后面?

    我正在 Apache Tomcat 上使用 Spring 框架部署一个应用程序 直接从 Tomcat 运行应用程序时 任何 URL 中根本没有附加 jsessionid 但是在将应用程序映射到域并尝试运行它之后 我在应用程序中的每个 URL
  • SPARQL 两个节点之间的路径

    给定一个图 prefix da
  • Delphi:将 TImage 置于前面

    看下图 如您所见 我无法将按钮发送到后面 这仅适用于标签 那么我该如何发送TImage到前面以其透明度 顺便说一句我读过这个相关问题 https stackoverflow com questions 5369681 controls on
  • Rails 3.2 水豚 Capybara::ElementNotFound: 无法找到 xpath“/html”

    我正在尝试使用 rspec 2 10 0 capybara 1 1 2 测试我的 Rails 应用程序 这是我的测试文件 require spec helper describe AdminPanelController do descri
  • 过程宏可以作为函数进行调试吗?

    我正在尝试调试我正在使用的库中的复杂程序宏 由于我无法将调试器与宏一起使用 并且各种宏扩展工具已被证明在这里毫无用处 因此我正在寻找替代方案 程序宏可以像函数一样运行并进行适当的调试吗 我想象存储结果proc macro TokenStre