我尝试了一个简单的过程宏,遵循文档中的示例,更具体地说:
#[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
。为此,您通常会使用syn
和quote
库,它们允许您使用quote
宏轻松解析和转换输入并创建新的TokenStream
。
syn
特别有几个示例,对于属性宏,请查看trace-var
。