我想創建一個宏,將接受任意代碼塊作爲它的參數一樣如何任意代碼塊傳遞到C宏爲PARAM
FOR_VECTOR(type, vect, code_block) \
for(vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i) { \
code_block; \
}
的問題是在參數代碼塊,其中可能包含任意數量的,
和)
個字符。
有沒有什麼好的解決方案?
我想創建一個宏,將接受任意代碼塊作爲它的參數一樣如何任意代碼塊傳遞到C宏爲PARAM
FOR_VECTOR(type, vect, code_block) \
for(vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i) { \
code_block; \
}
的問題是在參數代碼塊,其中可能包含任意數量的,
和)
個字符。
有沒有什麼好的解決方案?
有許多可能的解決方案。
如果你只需要一個表達式(不是一個完整的老式代碼塊) - 你可以將其括在(
和)
FOR_VECTOR(int, v, (func(i,1)))
將工作 - (func(i,1))
就像是一個宏參數處理
如果您的預處理器支持它,另一個部分解決方案是variadic macros。
您可以定義宏
#define COMMA ,
#define LPAR (
#define RPAR)
,並用它們來形成你的代碼塊insted的真實(
,
和)
FOR_VECTOR(int, v, func LPAR i COMMA 1 RPAR)
這不是很可讀雖然。
或者你可以用註釋掉宏替換後的字符串文字的報價一招:
FOR_VECTOR(type, vect, code_block) \
for(vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i) { \
/code_block/; \
}
FOR_VECTOR(int, v, *"*/ func(i,1); proc(i,2); /*"*)
特別感謝'*「*// *」*'技巧。有用! – user2732454
我爲需要維護該代碼的人以外的任何人哭了。 :) –
你的意思是除了「不這樣做」?你熟悉*功能*嗎?函子?或者在C++ 11中,* lamdas *? – WhozCraig
他說什麼^^。除此之外,將它括起來。預處理器足夠聰明以識別括號。 – 2013-08-31 21:10:53
好的,我會考慮所有的選擇,但我想要這樣一個宏:)而且我不能用完整的代碼塊加上括號,只有一個表達式。 – user2732454