2015-10-18 92 views
0

假設我有一些宏調用這樣:使用宏,如何獲得結構字段的唯一名稱?

my_macro!(Blah, (a, b, c)); 

,並將其輸出是這樣的:

struct Blah { 
    a: i32, 
    b: i32, 
    c: i32 
} 
impl Blah { 
    fn foo() -> i32 { 
     a + b + c 
    } 
} 

(人工例子)

這些領域將是私有的結構,但我需要允許重新定義。因此,輸入

my_macro!(Blah, (a, b, c, a)); 

會產生這樣的:

struct Blah { 
    a1: i32, 
    b: i32, 
    c: i32, 
    a2: i32 
} 
impl Blah { 
    fn foo() -> i32 { 
     a1 + b + c + a2 
    } 
} 

命名方案並不需要遵循任何邏輯模式。

這可能嗎?

回答

3

不使用編譯器插件,不,我不相信這是可能的。原因有兩個:

  1. 您不能構造標識符。有concat_idents!,但由於宏擴展的方式,在這種情況下沒用。

  2. 你不能做非文字比較。也就是說,宏觀方面沒有辦法確定它已經在之前看過a

關於你可以得到最接近的是剛剛徹底與標識符的固定列表取代所提供的所有標識符,但是這可能不是你想要的;在這種情況下,只需指定您需要4個字段並生成固定大小的數組[i32; 4]會更容易。

相關問題