【问题标题】:Is it possible to emit Rust attributes from within macros?是否可以从宏中发出 Rust 属性?
【发布时间】:2017-01-30 21:22:39
【问题描述】:

我正在尝试执行以下操作:

macro_rules! attr_trial {
    ($msg:expr) => {{
        let id = env!("SOME_ENV");

        #[link_section = env!("SOME_ENV")]
        static MESSAGE: &'static str = $msg;
    }};
}

我收到以下错误:

error: unexpected token: `env`
  --> src/main.rs:34:18
   |
34 |            #[link_section = env!("SOME_ENV")]
   |                           ^

【问题讨论】:

    标签: macros rust


    【解决方案1】:

    是否可以从宏中发出 Rust 属性?

    绝对,这是可能的。这是一个从宏中发出test 属性的宏:

    macro_rules! example {
        () => {
            #[test]
            fn test() {
                assert!(false);
            }
        };
    }
    
    example!();
    

    然而,这并非在所有情况下都是可能的。例如,您不能发出 just 属性,因为该属性预计会附加到项目:

    macro_rules! example {
        () => {
            #[test]
        };
    }
    
    // Fails!
    example!();
    fn test() {
        assert!(false);
    }
    

    您的 实际 问题更接近于“是否可以在属性内调用宏”。答案是是的,但仅从Rust 1.54 开始。

    在该版本之前,解析器不期望在该位置进行宏扩展。如果您需要它,您可能需要查看代码生成或过程宏,具体取决于您要执行的操作。

    有关详细信息,请参阅How is it possible to keep Rust module documentation in separate Markdown files? 上的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2014-03-21
      • 1970-01-01
      • 2013-02-07
      • 2014-05-28
      • 1970-01-01
      相关资源
      最近更新 更多