当我在具有多个捕获的宏中使用 lambda 时,遇到以下错误之一(Visual Studio 2017):
错误 C2143 语法错误:“;”之前缺少“]”
错误C2958左括号'['
如何避免此错误?
代码示例:
#include <functional>
#include <iostream>
#define MYMACRO(lambda) lambda
int main()
{
int a = 13;
int b = 37;
auto lambda = MYMACRO([a, b]() { std::cout << a << b << std::endl; });
lambda();
return 0;
}
最佳答案
GCC 给出了稍微更友好的错误消息:
10:73: error: macro "MYMACRO" passed 2 arguments, but takes just 1
lambda 声明中的逗号被解释为宏的分隔参数。您需要将表达式括在括号中:
#include <functional>
#include <iostream>
#define MYMACRO(lambda) lambda
int main()
{
int a = 13;
int b = 37;
auto lambda = MYMACRO(([a, b]() { std::cout << a << b << std::endl; }));
lambda();
return 0;
}
Visual studio 发出警告,然后忽略虚假的宏参数,因此您的代码相当于:
auto lambda = MYMACRO([a);
这使得错误消息更容易理解。请参阅https://learn.microsoft.com/en-gb/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4002
关于C++ 宏和 lambda 捕获,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49817415/