Вот минимальный пример:
#define repeat 5 // I added this, because 'repeat' is not mentionned in your question
#define MACRO_FN(test, pre, var1, size) \
do { \
printf("%s: ", #test); \
for (int i = 0; i < repeat; i++) { \
pre; \
test; \
} \
} while (0)
void foo()
{
}
void func(int a, int b)
{
}
int main()
{
MACRO_FN(func(2, 3), foo(), var1, size);
}
После предварительной обработки код эквивалентен следующему:
int main()
{
printf("%s: ", "func(2,3)");
for (int i = 0; i < 5; i++)
{
foo();
func(2, 3);
}
}
Таким образом, этот макрос является оберткой, которая печатает имя функции плюс ее параметры, когда она вызывается с макросом и выполняет эту функцию, указанную в первом параметре repeat
раз (независимо от того, repeat
есть). Если второй параметр пропущен, функция с таким именем просто не вызывается перед функцией, упомянутой ранее, как в следующем примере:
int main()
{
MACRO_FN(func(2, 3),, var1, size);
}
После предварительной обработки код эквивалентен следующему:
int main()
{
printf("%s: ", "func(2,3)");
for (int i = 0; i < 5; i++)
{
;
func(2, 3);
}
}
Примечание
Я удалил do while(0)
из эквивалентных программ для краткости, прочитайте эту статью SO для получения дополнительной информации: