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); /*"*)
masz na myśli oprócz „nie rób tego”? Czy znasz * funkcje *? Funktorzy? Lub w C++ 11, * lamdas *? – WhozCraig
Co on ^^ powiedział. Oprócz tego, zedytuj go. Preprocesor jest wystarczająco inteligentny, aby rozpoznawać nawiasy. –
OK, rozważę wszystkie alternatywy, ale chcę takiego makra :) I nie mogę parentesize pełny blok kodu, tylko jedno wyrażenie. – user2732454