foo(const std::function& functor) {
....
}
#define MACRO_EXAMPLE(functor) foo(functor)
int main() {
int i = 0, j = 0;
MACRO_EXAMPLE([
Add one more round of parenthesis:
MACRO_EXAMPLE(([i, j](){}));
// ^ ^
Otherwise the part before ,
is interpreted as macro's first parameter, and the part after ,
is interpreted as the macro's second parameter.
As an alternative to @SingerofTheFall's answer (which fixes the problem when invoking the macro), you can also fix the problem in the macro itself, by making it variadic:
#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)
This works by allowing the preprocessor to parse the lambda at ,
tokens into multiple arguments, but then uses all of these arguments and the separating commas again, so the net effect is what you want.