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

Code in procedural macro is not added to stream

我正在按照 documentation 中的示例尝试一个简单的程序宏,更具体地说:

#[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
}

然后我运行我的crate的主要功能:

use test_macro::test_macro;

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

并且没有打印出来。 我想也许 main 方法不能附加宏,所以我测试了另一个函数,它也没有用。 我很困惑,我错过了什么?

在过程宏中写入 stdout 将在编译时执行,如文档准确说明:

This following example shows the stringified TokenStreams that the attribute macros see. The output will show in the output of the compiler.

如您所见,您需要 return 一个 TokenStream 与您的宏的所需输出。为此,您通常会使用 syn and quote 库,它允许您解析和转换输入并使用 quote 宏轻松创建新的 TokenStream

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