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

Gil*_*man 3 macros rust

我正在尝试做类似以下的事情:

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

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

我收到以下错误:

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

She*_*ter 6

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

当然,这是可能的.这是一个从宏中发出test属性的宏:

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

example!();
Run Code Online (Sandbox Code Playgroud)

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

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

// Fails!
example!();
fn test() {
    assert!(false);
}
Run Code Online (Sandbox Code Playgroud)

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