首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >不能调用类似函数的过程宏:不能扩展为语句。

不能调用类似函数的过程宏:不能扩展为语句。
EN

Stack Overflow用户
提问于 2019-01-14 00:03:52
回答 1查看 1.4K关注 0票数 2

我正试着把我的头放在像函数一样的过程宏上,并与基本的东西做斗争。

对于初学者,我尝试创建一个宏,该宏只打印所有令牌而不执行任何操作:

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

#[proc_macro]
pub fn my_macro(input: TokenStream) -> TokenStream {
    println!( "{:?}", input );

    TokenStream::new()
}

然后,我尝试在另一个二进制文件中使用它:

代码语言:javascript
运行
复制
extern crate rust_procmacro_test;

fn main() {
    rust_procmacro_test::my_macro!( aaa );
}

当我做cargo build时,我得到了这个:

代码语言:javascript
运行
复制
Compiling rust_procmacro_test v0.1.0 
Compiling procmacro_user v0.1.0 
error[E0658]: procedural macros cannot be expanded to statements (see issue #54727)
 --> src\main.rs:5:5
  |
5 |     rust_procmacro_test::my_macro!( aaa );
  |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

TokenStream [Ident { ident: "aaa", span: #0 bytes(114..117) }]
error: aborting due to previous error

它告诉我,这不能被编译,但是宏内部的println可以工作。这是怎么回事?

第54727期非常广泛,我不知道它与此有何关系。

我使用的是稳定的-i 686-pc-windows-gnu,rustc 1.31.1 (b6c32da9b 2018-12-18)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-14 01:06:37

这是怎么回事?

虽然可以在稳定的Rust中定义类似函数的过程宏,但还不可能将其作为表达式/语句调用。这是因为有应适用。还有其他地点,例如物品位置,在有物品的地方:

代码语言:javascript
运行
复制
extern crate rust_procmacro_test;

rust_procmacro_test::my_macro!( aaa );

fn main() {}

但是宏内部的println可以工作

这可能只是实现中的一些惰性-宏被急切地评估,然后特性门被检查。虽然这在目前可能是低效的,但一旦功能完全稳定下来,就不重要了。

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

https://stackoverflow.com/questions/54174361

复制
相关文章

相似问题

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