0

我正在尝试创建一个在结构上使用的宏,在该宏中,您将另一个结构作为参数,然后连接结构字段。这是宏的代码

#[proc_macro_attribute]
pub fn cat(args: proc_macro::TokenStream, input: proc_macro::TokenStream) -> proc_macro:: TokenStream {
    let mut base_struct = parse_macro_input!(input as ItemStruct);
    let mut new_fields_struct = parse_macro_input!(args as ItemStruct);

    if let syn::Fields::Named(ref mut base_fields) = base_struct.fields {
        if let syn::Fields::Named(ref mut new_fields) = new_fields_struct.fields {
            for field in new_fields.named.iter() {
                base_fields.push(field.clone());
            }
        }
    }

    return quote! {
        #base_struct
    }.into();
}

这是我希望使用它的基本示例

struct new_fields{
    field: usize,
}

#[cat(new_fields)]
struct base_struct{
    base_field, usize,
}

但是,它只会将单词“new_fields”转换为 TokenStream,然后编译失败,因为它不是结构。有没有办法将结构作为参数“传递”给宏,而无需在宏用法中编写代码?

4

1 回答 1

2

有没有办法将结构作为参数“传递”给宏,而无需在宏用法中编写代码?

不,宏对它们给出的令牌进行操作,仅此而已。

在不了解更多细节的情况下很难给出建议,但最接近您提供的内容是让您的宏生成另一个结构,以便它知道定义。你也许可以像这样传递它:

#[cat(
    struct new_fields{
        field: usize,
    }
)]
struct base_struct{
    base_field, usize,
}
于 2021-08-05T11:17:33.663 回答