无法调用类似函数的过程宏:无法扩展为语句
Cannot call a function-like procedural macro: cannot be expanded to statements
我正在努力了解类似函数的过程宏并努力学习基础知识。
首先,我尝试创建一个只打印所有标记但什么都不做的宏:
extern crate proc_macro;
extern crate syn;
use proc_macro::TokenStream;
#[proc_macro]
pub fn my_macro(input: TokenStream) -> TokenStream {
println!( "{:?}", input );
TokenStream::new()
}
然后我尝试在另一个二进制文件中使用它:
extern crate rust_procmacro_test;
fn main() {
rust_procmacro_test::my_macro!( aaa );
}
当我这样做时 cargo build
我得到这个:
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
有效。发生了什么事?
Issue #54727 非常广泛,我不确定它与此有何关系。
我正在使用 stable-i686-pc-windows-gnu,rustc 1.31.1 (b6c32da9b 2018-12-18)。
What is happening?
虽然可以在稳定的 Rust 中定义一个类似函数的过程宏,但还不能调用一个表达式/ 陈述。这是因为有concerns about how hygiene should be applied。还有其他位置,比如item位置,哪里有:
extern crate rust_procmacro_test;
rust_procmacro_test::my_macro!( aaa );
fn main() {}
but println
inside the macro works
这可能只是实现中的一些惰性——急切地评估宏,然后稍后检查功能门。虽然目前这可能效率低下,但一旦该功能完全稳定就没关系了。
我正在努力了解类似函数的过程宏并努力学习基础知识。
首先,我尝试创建一个只打印所有标记但什么都不做的宏:
extern crate proc_macro;
extern crate syn;
use proc_macro::TokenStream;
#[proc_macro]
pub fn my_macro(input: TokenStream) -> TokenStream {
println!( "{:?}", input );
TokenStream::new()
}
然后我尝试在另一个二进制文件中使用它:
extern crate rust_procmacro_test;
fn main() {
rust_procmacro_test::my_macro!( aaa );
}
当我这样做时 cargo build
我得到这个:
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
有效。发生了什么事?
Issue #54727 非常广泛,我不确定它与此有何关系。
我正在使用 stable-i686-pc-windows-gnu,rustc 1.31.1 (b6c32da9b 2018-12-18)。
What is happening?
虽然可以在稳定的 Rust 中定义一个类似函数的过程宏,但还不能调用一个表达式/ 陈述。这是因为有concerns about how hygiene should be applied。还有其他位置,比如item位置,哪里有:
extern crate rust_procmacro_test;
rust_procmacro_test::my_macro!( aaa );
fn main() {}
but
println
inside the macro works
这可能只是实现中的一些惰性——急切地评估宏,然后稍后检查功能门。虽然目前这可能效率低下,但一旦该功能完全稳定就没关系了。