名稱下面迭代器宏給我(不能改變)捕獲使用C宏
#define ITERATE(MACRO) \
MACRO(v1) \
MACRO(v2) \
MACRO(v3) \
MACRO(v4)
這背後的想法是,我現在可以定義自己的一個參數的宏,並將其傳遞到迭代器擴大爲v1
,v2
,v3
,v4
。例如:
#define MYSTUFF(X) doSth(X);
ITERATE(MYSTUFF)
將擴大到
doSth(v1); doSth(v2); doSth(v3); doSth(v4);
我現在的問題是,我想這想傳遞一個額外的參數爲MYSTUFF
超出一個提供的另一個宏內調用ITERATE
ITERATE
。
爲了實現這個目標,我希望我可以用下面的結構捕捉額外的參數名稱:
#define PARTIAL(T) FULL(UUU,T)
#define FULL(U,V) doSth(U,V)
#define START(UUU) ITERATE(PARTIAL)
START(bla)
我希望,當ITERATE(PARTIAL)
被擴展爲:
FULL(UUU,v1) FULL(UUU,v2) FULL(UUU,v3) FULL(UUU,v4)
我居然還會捕獲START
的參數UUU
,它將被替換爲bla
。不幸的是,情況並非如此(至少在gcc中)。
- 你知道這樣的名稱捕獲是否可以實現不同嗎?
- 或者您可能有不同的想法如何解決將額外參數傳入
MACRO
的問題? - 我可能會被允許更改
ITERATOR
定義本身,但前提是它不破壞任何現有代碼已經使用它。
如果您不允許更改宏,您是否至少允許用非宏代碼替換它? – stefan 2013-03-14 16:43:03
當然,我可以簡單*不*使用'ITERATE',或者自己創建一個可以接受更多參數的函數 - 如果這是您要求的。但我寧願避免這種情況。 – CygnusX1 2013-03-14 16:48:24
我建議徹底擺脫宏的使用,而不是寫另一個 – stefan 2013-03-14 16:50:55