2013-08-31 15 views
10

Chcę utworzyć makro, które będzie akceptować dowolny blok kodu jako parametr jakJak przekazać dowolny blok kodu w C makro jako param

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

Problemem jest blok kodu parametru, który może zawierać dowolna liczba znaków , i ).

Czy istnieje jakieś dobre rozwiązanie?

+0

masz na myśli oprócz „nie rób tego”? Czy znasz * funkcje *? Funktorzy? Lub w C++ 11, * lamdas *? – WhozCraig

+0

Co on ^^ powiedział. Oprócz tego, zedytuj go. Preprocesor jest wystarczająco inteligentny, aby rozpoznawać nawiasy. –

+0

OK, rozważę wszystkie alternatywy, ale chcę takiego makra :) I nie mogę parentesize pełny blok kodu, tylko jedno wyrażenie. – user2732454

Odpowiedz

8

Istnieje wiele możliwych rozwiązań.

Jeśli potrzebne jest tylko jedno wyrażenie (nie w pełni wykończonych bloku kodu) - można po prostu zamknąć go w ( i )

FOR_VECTOR(int, v, (func(i,1))) 

zadziała - (func(i,1)) jest traktowany jak pojedynczy makro argumentu

Innym rozwiązaniem częściowym jest variadic macros, jeśli twój preprocesor je obsługuje.

Można definiować makra

#define COMMA , 
#define LPAR (
#define RPAR) 

i wykorzystać je na formularzu blok kodu insted rzeczywistym (, i )

FOR_VECTOR(int, v, func LPAR i COMMA 1 RPAR) 

To nie jest bardzo czytelny choć.

Albo można zrobić sztuczkę z zakomentowanie notowania ciąg dosłownych po makra:

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

Specjalne podziękowania za sztuczkę '*" *// * "*'. To działa! – user2732454

+7

Płaczę za każdym, kto potrzebuje tego kodu. :) –

Powiązane problemy