Как передать произвольный код в макрос C в качестве параметра

Я хочу создать макрос, который будет принимать произвольный код в качестве его параметра, например

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

Проблема заключается в кодовом блоке в параметре, который может содержать произвольное число символов , и ).

Есть ли хорошее решение?

Ответ 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); /*"* )