Ответ 1
Существует ряд возможных решений.
Если вам нужно только одно выражение (не полный код кода), вы можете просто заключить его в (
и )
FOR_VECTOR( int, v, (func(i,1)) )
будет работать - (func(i,1))
обрабатывается как один аргумент макроса
Другим частичным решением является variadic macro, если ваш препроцессор поддерживает их.
Вы можете определить макросы
#define COMMA ,
#define LPAR (
#define RPAR )
и использовать их для формирования вашего кода, установленного с реальными (
,
и )
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); /*"* )