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

Macros 是否可以从宏中发出Rust属性?,macros,rust,Macros,Rust,我正在尝试做如下事情: macro_rules! attr_trial { ($msg:expr) => {{ let id = env!("SOME_ENV"); #[link_section = env!("SOME_ENV")] static MESSAGE: &'static str = $msg; }}; } 我得到以下错误: 错误:意外标记:`env` -->src/main.rs:34:18 | 34

我正在尝试做如下事情:

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

        #[link_section = env!("SOME_ENV")]
        static MESSAGE: &'static str = $msg;
    }};
}
我得到以下错误:

错误:意外标记:`env`
-->src/main.rs:34:18
|
34 |#[link_section=env!(“SOME_env”)]
|                           ^
是否可以从宏中发出Rust属性

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

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

example!();
然而,这不可能在所有情况下都实现。例如,不能仅发射属性,因为该属性应附加到项目:

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

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

您的实际问题更接近“是否可以在属性内部调用宏”。答案似乎是否定的-解析器不希望在该位置进行宏扩展。也许您想看看代码生成或过程宏,这取决于您尝试执行的操作