【问题标题】:Macro rule for matching a doc comment [duplicate]用于匹配文档注释的宏规则 [重复]
【发布时间】:2026-02-19 00:05:01
【问题描述】:

有没有办法匹配 Rust 的 macro_rules 中的文档?

我有一个宏,它为bindgen 创建的一堆 C 常量生成一个枚举:

macro_rules! id_enum {
    ( enum $name:ident: $typ:ty { $( $enum_name:ident => $value:expr ),* , } ) => { ... }
}

我想用文档注释(/// 注释)对每个注释进行注释,但这需要我的宏与文档 cmets 匹配。这可能吗?

【问题讨论】:

    标签: rust rust-macros


    【解决方案1】:

    Doc cmets 被翻译成表单的属性

    #[doc = "documentation text"]
    

    并且可以以翻译形式匹配:

    macro_rules! print_doc {
        (#[doc = $doc:expr]) => {
            pub fn foo() {
                println!($doc);
            }
        }
    }
    
    print_doc!(
        /// gloink
    );
    
    fn main() {
        foo();
    }
    

    如果您想以修改后的形式发出文档注释,则需要在宏中使用属性语法,如此答案中所述:

    要将原始文档注释与您的注释连接起来,您可以使用标准库中的宏 concat!()。但是,属性内不允许宏调用,因此您需要一个辅助宏,例如

    macro_rules! annotated_func {
        ($doc:expr) => {
            #[doc = $doc]
            pub fn foo() {
                println!($doc);
            }
        }
    }
    
    macro_rules! print_doc {
        (#[doc = $doc:expr]) => {
            annotated_func!(concat!($doc, "\nannotation"));
        }
    }
    

    【讨论】:

    • 哦,酷,不知道文档的属性形式。这可以解释我得到的“没有规则匹配#”错误。