过程宏中的代码未添加到流中



我尝试了一个简单的过程宏,遵循文档中的示例,更具体地说:

#[proc_macro_attribute]
pub fn show_streams(attr: TokenStream, item: TokenStream) -> TokenStream {
println!("attr: "{}"", attr.to_string());
println!("item: "{}"", item.to_string());
item
}

它显示了这个宏如何用两个打印为函数做准备。然而,我试图重现一个更简单的情况,我的宏是:

#[proc_macro_attribute]
pub fn test_macro(_: TokenStream, item: TokenStream) -> TokenStream {
println!("Macro start");
item
}

然后我运行板条箱的主要功能:

use test_macro::test_macro;
#[test_macro]
fn main() {
println!("yup");
}

没有出现任何指纹。我想main方法可能不能附加宏,所以我测试了另一个函数,它也不起作用。我很困惑,我错过了什么?

在过程宏中写入stdout将在编译时执行,就像文档准确地声明的那样:

以下示例显示了属性宏所看到的字符串化TokenStreams。输出将显示在编译器的输出中。

正如您所注意到的,您需要返回一个具有所需宏输出的TokenStream。为此,您通常会使用synquote库,它们允许您使用quote宏轻松解析和转换输入并创建新的TokenStream

syn特别有几个示例,对于属性宏,请查看trace-var

最新更新