0

What's happening in this macro? I understand that #test expand this parameter to the literal text. But what does pre; and test; do?

#define MACRO_FN(test, pre, repeat, size) \ do { \ printf("%s: ", #test); \ for (int i = 0; i < repeat; i++) { \ pre; \ test; \ } \ } while (0) 

This is used like so

MACRO_FN(a_func(an_array, size),, var1, size); 

What do the double commas mean here?

10
  • 3
    Run the code through the preprocessor and look what the macro expands to. Commented Nov 19, 2018 at 12:36
  • 1
    To omit pre;- maybe? Did you check the pre-processed code? Commented Nov 19, 2018 at 12:37
  • I didn't think to check the output of the pre-processor, but I'll do that now Commented Nov 19, 2018 at 12:47
  • 2
    When invoking a preprocessor macro , "blank" is a valid argument; the call MACRO_FN(a,,b,c) means that pre will expand to blank Commented Nov 19, 2018 at 12:50
  • 2
    Please note that macros like these should be avoided like the plague. Commented Nov 19, 2018 at 12:55

2 Answers 2

3

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:

Sign up to request clarification or add additional context in comments.

Comments

3

pre and test seem to be two functions. Based on how it is written, we can guess that pre is a function called before the test.

The double comma has no special meaning. It is just here because the second parameter (pre) was omitted.

Edit: As a side note that kind of macro "should be avoided like plague", as @Lundin put it.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.