C++ 宏和 lambda 捕获

标签 c++ lambda macros capture

当我在具有多个捕获的宏中使用 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/

相关文章:

c# - 与 C# 中的嵌套表达式树作斗争

xcode - XCode 中的语法感知选择?

python - 对对象列表进行排序,TypeError : unorderable types

lambda - 类文件在文件系统中的含义

objective-c - 带有宏的外部函数

c++ - 代码无法选择声明的宏

c++ - Scons 没有指定 CPPPATH,仍然可以检测到 .h 依赖吗?

c++ - Waitpid 等待已失效的子进程

c++ - QObject::connect 中 Func2 类型的参数?

c++ - 打开窗口时应用程序崩溃 qt