Is it possible to emit Rust attributes from within

2020-02-07 04:25发布

问题:

I'm trying to do something like the following:

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

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

And I get the following error:

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

回答1:

Is it possible to emit Rust attributes from within macros?

Absolutely, it is possible. Here's a macro that emits a test attribute from within a macro:

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

example!();

It's not possible in all contexts, however. For example, you can't emit just an attribute because the attribute is expected to be attached to an item:

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

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

Your actual question is closer to "is it possible to call a macro inside of an attribute". The answer to that appears to be no - the parser does not expect a macro expansion in that location. Perhaps you want to look at code generation or procedural macros, depending on what you are trying to do.



标签: macros rust