2014-09-02 85 views
-1

有沒有辦法提供一個代碼的整個塊作爲參數的宏,並將其擴展到定義?如何將代碼塊用作c預處理器指令的參數?

#define PATTERN(param,func)\ 
    chk=new wxCheckBox(page,wxID_ANY,param);\ 
    sizer->Add(chk,0,0,0);\ 
    chk->Bind(wxEVT_CHECKBOX,func); 

PATTERN("checkbox 1", 
//piece of code 
[=](wxCommandEvent& event){ 
    wxMessageBox(wxT("test"),wxT(""),wxICON_INFORMATION); 
    } 
//end of code 
) 

如何封裝這些手段的代碼? 我希望能夠做到:

#define DERIVATIVE(s)\ 
     PATTERN(...) 
+0

一般來說,這是可能的。你有沒有編譯錯誤? – MrTux 2014-09-02 16:50:24

+0

逗號會干擾他們嗎?你最終會得到多個附加參數。我可以使用__VAR_ARGS,但我想知道是否有一個優雅的解決方案 – aelgoa 2014-09-02 16:51:12

+0

爲什麼不使用一個小的靜態函數呢? – MrTux 2014-09-02 16:52:57

回答

1

你最好不要使用兩套宏這個

#define TEMPLATE_CODE(INSERTME) \ 
    ... \ 
    INSERTME(); \ 
    ... 

#define SPECIALIZED_CODE() \ 
    ... 

TEMPLATE_CODE(SPECIALIZED_CODE); 

舉個例子,

#define TEMPLATE_CODE(INSERTME, ARG) void sayhello(void) { INSERTME(ARG); } 
#define OTHER_TEMPLATE(INSERTME, ARG) class myclass { INSERTME(ARG); } 
#define FIRST_IMPL(ARG) cout << ARG << endl 
#define WRAPPER() TEMPLATE_CODE(FIRST_IMPL, ARG) 
OTHER_TEMPLATE(WRAPPER, "hello world") 
#undef FIRST_IMPL 
#undef WRAPPER 
+0

是的,但我需要再次使用TEMPLATE在其他宏的內部,必須嵌套定義這將證明不可能的afaik,我不認爲我甚至可以使用基於include的指令,因爲SPECIALIZED將是行特定的而不是可變的。 – aelgoa 2014-09-02 17:37:49

+0

@aelgoa是我尋找的例子嗎?如果不是,你會如何調整它成爲你想要的? – randomusername 2014-09-02 17:52:39