C++中[]()语法含义及Arduino ESP32回调场景用法咨询
解答
你看到的[]() {}结构是C11标准引入的Lambda表达式(匿名函数),ESP32的Arduino核心默认支持C11语法,你用到的WebServer相关库的on方法,就是通过Lambda表达式来快速注册不同路径、不同HTTP请求方式的处理回调。
方括号[]:捕获列表
作用是声明当前Lambda可以访问外部作用域的哪些变量,常见用法:
- 空捕获
[]:不捕获任何外部局部变量,只能使用Lambda内部定义的变量、或者全局变量,你给出的示例就是这种用法,说明回调不需要用到外部局部变量 - 值捕获
[=]:把外部作用域所有可见变量复制一份到Lambda内部使用,内部修改不会影响外部原值 - 引用捕获
[&]:直接引用外部作用域的可见变量,内部修改会同步到外部原变量 - 指定变量捕获
[var1, &var2]:仅捕获指定的变量,var1按值捕获,var2按引用捕获
圆括号():参数列表
和普通函数的参数列表作用完全一致,用来定义调用这个Lambda时需要传入的参数的类型、数量。
你示例中用到的普通请求回调不需要传入参数,所以参数列表是空的();如果是处理文件上传、表单数据接收的特殊回调,参数列表中会填入对应的形参来接收数据。
额外补充你贴的两种调用形式的区别:
- 第一种只有1个Lambda参数:对应路径指定请求方式的处理回调,收到匹配请求时直接执行Lambda内的代码
- 第二种有2个Lambda参数:第一个是请求完整接收完成后的处理回调,第二个是请求体数据分段接收时的逐块处理回调,一般用来处理固件上传、大体积表单提交这类场景
内容的提问来源于stack exchange,提问作者Cool Javelin
相关产品推荐
相关产品推荐

