C++ 宏和 lambda 捕获
c++ macro and lambda capture
当我在具有多个捕获的宏中使用 lambda 时,我遇到了这些错误之一 (Visual Studio 2017) :
Error C2143 syntax error: missing ']' before ';'
Error C2958 the left bracket '['
如何避免这个错误?
代码示例:
#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://docs.microsoft.com/en-gb/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4002
如其他地方所述,实际错误是 MYMACRO
只需要一个参数。除非用括号或引号括起来,否则逗号用于分隔宏调用的单独参数。
一个 lambda 在捕获括号中可能有多个逗号,所以 MYMACRO
如果您想让调用语法与您的程序中的相同,实际上需要能够处理可变参数。这是可能的,因为 C++11 添加了对可变参数宏的支持。
Visual Studio 2017 支持可变宏语法。因此,您可以将宏更改为:
#define MYMACRO(...) __VA_ARGS__
注意可变参数只能出现在宏参数规范的末尾。
当我在具有多个捕获的宏中使用 lambda 时,我遇到了这些错误之一 (Visual Studio 2017) :
Error C2143 syntax error: missing ']' before ';'
Error C2958 the left bracket '['
如何避免这个错误?
代码示例:
#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://docs.microsoft.com/en-gb/cpp/error-messages/compiler-warnings/compiler-warning-level-1-c4002
如其他地方所述,实际错误是 MYMACRO
只需要一个参数。除非用括号或引号括起来,否则逗号用于分隔宏调用的单独参数。
一个 lambda 在捕获括号中可能有多个逗号,所以 MYMACRO
如果您想让调用语法与您的程序中的相同,实际上需要能够处理可变参数。这是可能的,因为 C++11 添加了对可变参数宏的支持。
Visual Studio 2017 支持可变宏语法。因此,您可以将宏更改为:
#define MYMACRO(...) __VA_ARGS__
注意可变参数只能出现在宏参数规范的末尾。