2011-05-21 28 views
4

我正在使用包含一組預處理器庫的庫。其中之一是FOR_EACH風格宏,它遍歷__VA_ARGS__併爲每個參數調用用戶提供的宏。提供宏觀的用戶稱爲像:SOME_MACRO(current_arg)具有「佔位符」值的宏

然而,問題是,它僅與採取參數用戶提供的宏的作品。我試圖做一些特殊的事情,其中​​包括struct的名稱和結構中的每個字段。問題是,這需要宏的兩個參數。

由於我正在使用的庫只接受一元宏,有沒有辦法將一個額外的參數「綁定」到我的宏?

截至目前,我必須在我的宏中硬編碼結構的名稱。所以,如果我的工作的struct名爲Foo,我不得不說:

#define MY_MACRO(FIELD) /* do something with &Foo::FIELD */ 

有什麼方法我可以「綁定」第二STRUCT參數宏,也許一些進一步的間接,使當庫調用我的宏時,它將能夠擴展爲:

#define MY_MACRO(FIELD) /* do something with &STRUCT::FIELD */ 
+1

也許你可以有'FIELD'是'(A,B)',所以A'是'STRUCT'的值,'B'是'FIELD'的值(在你的擴展中)? – 2011-05-21 16:33:23

+0

我很想知道這是否可能。 – 2011-05-21 17:10:59

+1

增加了預處理器標籤,允許搜索@iammilind解釋的技術。 – 2011-05-21 17:20:54

回答

4

是的。您可以使用以下技術。

#define MY_MACRO(FIELD) EXPAND FIELD 
#define EXPAND(X, FIELD) X::FIELD() 

用法在下面的測試代碼:

struct foo { static int f() { return 0; } }; 
struct STRUCT { static int f() { return 1; } }; 

#define MY_MACRO(FIELD) EXPAND FIELD 
#define EXPAND(X, FIELD) X::FIELD() 

int main() 
{ 
    int i = MY_MACRO((STRUCT,f)); // see here braces inside braces 
} 

上面的代碼擴展到,

int main() 
{ 
    int i = STRUCT::f(); 
}