C++ C++;使用2+;捕获的元素生成错误 foo(const std::function和functor){ .... } #定义宏\u示例(函子)foo(函子) int main(){ int i=0,j=0; 宏_示例([i](){});//工作正常 MACRO_-EXAMPLE([i,j](){});//错误:宏“MACRO_-EXAMPLE”传递了2个参数,但只接受1个参数 }); }

C++ C++;使用2+;捕获的元素生成错误 foo(const std::function和functor){ .... } #定义宏\u示例(函子)foo(函子) int main(){ int i=0,j=0; 宏_示例([i](){});//工作正常 MACRO_-EXAMPLE([i,j](){});//错误:宏“MACRO_-EXAMPLE”传递了2个参数,但只接受1个参数 }); },c++,lambda,macros,C++,Lambda,Macros,为什么??如何使宏理解lambdas?再添加一轮括号: foo(const std::function<void()>& functor) { .... } #define MACRO_EXAMPLE(functor) foo(functor) int main() { int i = 0, j = 0; MACRO_EXAMPLE([i](){}); // works fine MACRO_EXAMPLE([i, j](){}); //

为什么??如何使宏理解lambdas?

再添加一轮括号:

foo(const std::function<void()>& functor) {
    ....
}

#define MACRO_EXAMPLE(functor) foo(functor)

int main() {
    int i = 0, j = 0;
    MACRO_EXAMPLE([i](){}); // works fine
    MACRO_EXAMPLE([i, j](){}); // error: macro "MACRO_EXAMPLE" passed 2 arguments, but takes just 1
  });
}
否则,
之前的部分将被解释为宏的第一个参数,
之后的部分将被解释为宏的第二个参数。

作为(调用宏时解决问题的)的替代方法,您也可以通过使其可变来解决宏本身的问题:

MACRO_EXAMPLE(([i, j](){}));
//            ^          ^

这是通过允许预处理器将
标记处的lambda解析为多个参数来实现的,但随后再次使用所有这些参数和分隔的逗号,因此净效果就是您想要的。

就。。。不要使用宏。
#define MACRO_EXAMPLE(...) foo(__VA_ARGS__)