Esistono numerose soluzioni possibili.
Se avete bisogno di una sola espressione (non un blocco di codice completo di moda) - si può solo racchiuderlo tra (
e )
FOR_VECTOR(int, v, (func(i,1)))
lavorerà - (func(i,1))
è trattato come singolo argomento macro
Un'altra soluzione parziale è variadic macros, se il tuo preprocessore li supporta.
È possibile definire le macro
#define COMMA ,
#define LPAR (
#define RPAR)
e li usa per formare il vostro blocco di codice invece di vera (
,
e )
FOR_VECTOR(int, v, func LPAR i COMMA 1 RPAR)
Non è molto leggibile però.
Oppure si può fare un trucco con commentando citazioni di una stringa letterale dopo macro sostituzione:
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); /*"*)
fonte
2013-08-31 21:29:15
Vuoi dire oltre a "non farlo"? Conoscete le * funzioni *? Funtori? O in C++ 11, * lamdas *? – WhozCraig
Cosa disse ^^. A parte questo, mettilo in parentesi. Il preprocessore è abbastanza intelligente da riconoscere le parentesi. –
OK, prenderò in considerazione tutte le alternative, ma voglio una tale macro :) E non riesco a parentesi il blocco di codice completo, solo una espressione. – user2732454