gpt4 book ai didi

macros - 为什么此宏会导致未解析的名称错误?

转载 作者:行者123 更新时间:2023-11-29 07:49:57 25 4
gpt4 key购买 nike

我想编译类似于这个最小测试用例的代码:

macro_rules! why {
( [ $saved:ident ] $body:block ) => {
let $saved = 3;
$body
let _a = $saved;
}
}

fn bar() {
why!([saved] {
});
}

fn main() {
}

当我尝试编译它时,出现以下错误:

src/main.rs:10:20: 10:21 error: unresolved name `saved` [E0425]
src/main.rs:10 why!([saved] {
^
src/main.rs:10:9: 11:12 note: in this expansion of why! (defined in src/main.rs)
src/main.rs:10:20: 10:21 help: run `rustc --explain E0425` to see a detailed explanation

其他引入变量的宏有效;这里有什么问题?

最佳答案

这是因为 macro_rules! 在涉及扩展为语句的宏时有点被破坏了。

问题基本上是出于卫生目的独立考虑每个语句。换句话说,第三条语句实际上看不到第一行定义的绑定(bind)。

在某些情况下,您可以通过将语句包装在一个 block 中来解决此问题:

macro_rules! why {
( [ $saved:ident ] $body:block ) => {
{
let $saved = 3;
$body
let _a = $saved;
}
}
}

关于macros - 为什么此宏会导致未解析的名称错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34965233/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com