Вы можете передать другой параметр в макрос, чтобы определить оператор вывода.
Примерно так:
#define WRAP_MY_FUNCTION(x, Y) void x(int integer){printf("begin\n"); Y; printf("end\n");}
WRAP_MY_FUNCTION(Foo, printf("hello world\n"))
Если вы хотите прояснить для конечного пользователя, что это блок кода и, как указал Ричи, добавление Variadi * Макрос 1008 * для исправления незащищенных запятых, которые могут быть в вашем источнике, вы можете переписать определение следующим образом:
#define WRAP_MY_FUNCTION(x, ...)\
void x(int integer) \
{ \
printf("begin\n"); \
__VA_ARGS__ \
printf("end\n"); \
} \