Here is a minimal example:
#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);
}
Once preprocessed, the code is equivalent to this:
int main()
{
printf("%s: ", "func(2,3)");
for (int i = 0; i < 5; i++)
{
foo();
func(2, 3);
}
}
So that macro is a wrapper that prints the function name plus it's parameters as it is invoked with the macro and executes that function specified in the first parameter repeat
times (whatever repeat
is). If the second parameter is omitted, the function that has that name is simple not invoked before the function mentioned before as in the following example:
int main()
{
MACRO_FN(func(2, 3),, var1, size);
}
Once preprocessed, the code is equivalent to this:
int main()
{
printf("%s: ", "func(2,3)");
for (int i = 0; i < 5; i++)
{
;
func(2, 3);
}
}
Note:
I removed the do while(0)
from the equivalent programs for brevity, read this SO article for more information: