2017-01-30 61 views
2

我試圖做類似如下:是否可以從宏內發出Rust屬性?

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")] 
    |       ^

回答

5

Is it possible to emit Rust attributes from within macros?

絕對,這是可能的。下面是從宏觀內發出test屬性的宏:

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

example!(); 

這是不可能在所有的環境中,但是。

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

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

實際問題是更接近「是可以調用:例如,由於屬性有望被附着於項目不能發出只是屬性屬性內的宏「。答案似乎是 - 解析器不希望在該位置進行宏擴展。也許你想看看代碼生成或程序宏,這取決於你正在嘗試做什麼。

相關問題