2013-08-31 55 views
10

我想創建一個宏,將接受任意代碼塊作爲它的參數一樣如何任意代碼塊傳遞到C宏爲PARAM

FOR_VECTOR(type, vect, code_block) \ 
    for(vector<type>::iterator i=vect.begin(); i!=vect.end(); ++i) { \ 
    code_block; \ 
    } 

的問題是在參數代碼塊,其中可能包含任意數量的,)個字符。

有沒有什麼好的解決方案?

+0

你的意思是除了「不這樣做」?你熟悉*功能*嗎?函子?或者在C++ 11中,* lamdas *? – WhozCraig

+0

他說什麼^^。除此之外,將它括起來。預處理器足夠聰明以識別括號。 – 2013-08-31 21:10:53

+0

好的,我會考慮所有的選擇,但我想要這樣一個宏:)而且我不能用完整的代碼塊加上括號,只有一個表達式。 – user2732454

回答

8

有許多可能的解決方案。

如果你只需要一個表達式(不是一個完整的老式代碼塊) - 你可以將其括在()

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); /*"*) 
+1

特別感謝'*「*// *」*'技巧。有用! – user2732454

+7

我爲需要維護該代碼的人以外的任何人哭了。 :) –