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

时间:2017-01-30 21:22:39

标签: macros rust

我正在尝试做以下事情:

Response[0]

我收到以下错误:

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

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

1 个答案:

答案 0 :(得分:5)

  

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

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

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

example!();
然而,

在所有情况下都不可能。例如,您不能发出只是属性,因为该属性应该附加到项目上:

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

// Fails!
example!();
fn test() {
    assert!(false);
}

您的实际问题更接近于“是否可以在属性中调用宏”。答案似乎是没有 - 解析器不期望在该位置进行宏扩展。您可能希望查看代码生成或过程宏,具体取决于您要执行的操作。