2013-08-31 6 views
10

Voglio creare una macro che accetterà blocco di codice arbitrario come parametro comeCome passare blocco di codice arbitrario C macro come un param

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

Il problema è il blocco di codice nel parametro, che può contenere numero arbitrario di caratteri , e ).

C'è qualche buona soluzione?

+0

Vuoi dire oltre a "non farlo"? Conoscete le * funzioni *? Funtori? O in C++ 11, * lamdas *? – WhozCraig

+0

Cosa disse ^^. A parte questo, mettilo in parentesi. Il preprocessore è abbastanza intelligente da riconoscere le parentesi. –

+0

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

risposta

8

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

Un ringraziamento speciale per il trucco '*" *// * "*'. Funziona! – user2732454

+7

Piango per qualcuno diverso da te che ha bisogno di mantenere quel codice. :) –

Problemi correlati