代码之家  ›  专栏  ›  技术社区  ›  Colonel Thirty Two

匹配文档注释的宏规则[重复]

  •  1
  • Colonel Thirty Two  · 技术社区  · 7 年前

    这个问题已经有了答案:

    有办法和Rust的DocComments匹配吗 macro_rules ?

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

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

    我想用一个文档注释(a /// 注释),但这要求我的宏与文档注释匹配。有可能吗?

    1 回复  |  直到 7 年前
        1
  •  3
  •   Sven Marnach    7 年前

    文档注释被转换为表单的属性

    #[doc = "documentation text"]
    

    并可在其翻译形式中匹配:

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

    如果要以修改后的形式发出doc注释,则需要在宏中使用属性语法,如下面的回答所述:

    要将原始文档注释与注释连接起来,可以使用宏 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"));
        }
    }
    
    推荐文章