搜索
bottom↓
回复: 17
打印 上一主题 下一主题

c++ 调用函数的语句中, [&] 是什么意思呢?

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2022-1-9 23:16:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一个arduino 的头文件中,调用函数的语句中看到一个没见过的用法:  [&]  ,
而且好像是把其他的功能语句全部放在调用函数的参数中:

。。。。。。 中间部分还有很多调用函数的语句。



请大神看看 [&] 是什么东西?  另外,把大段的语句放在函数的参数是不是很常见?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入618汤圆

2
发表于 2022-1-9 23:29:45 | 只看该作者
Lambda函数。

出0入0汤圆

3
发表于 2022-1-9 23:35:44 | 只看该作者
这是c++11的新特性,叫做lambda表达式。
方括号里的内容表示捕获的方式,[&]是让编译器以引用的方式自动推断需要捕获的变量,与之对应的[=]是值捕获。

出200入2554汤圆

4
发表于 2022-1-10 00:03:31 来自手机 | 只看该作者
玩8266/esp32服务器了吧?
这是C++11的 lambda 表达式。
效果是可以在函数内部嵌套定义另一个函数

实际上我更倾向于在这里搞一个函数指针。

出0入0汤圆

5
发表于 2022-1-10 01:24:27 来自手机 | 只看该作者
t3486784401 发表于 2022-1-10 00:03
玩8266/esp32服务器了吧?
这是C++11的 lambda 表达式。
效果是可以在函数内部嵌套定义另一个函数

函数指针就要自己传很多变量进去,也麻烦。

出200入2554汤圆

6
发表于 2022-1-10 01:44:40 来自手机 | 只看该作者
xmlbb 发表于 2022-1-10 01:24
函数指针就要自己传很多变量进去,也麻烦。

这个是HttpServer的 on 方法,绑定访问目录时回调函数。

用limbda表达式只会让 setup函数变得巨臃肿,效果和你外边定义个全局函数,这里传函数指针一样。
除了展示C++11独特的语法外,没看着什么优势。

出0入0汤圆

7
发表于 2022-1-10 09:05:00 | 只看该作者
t3486784401 发表于 2022-1-10 01:44
这个是HttpServer的 on 方法,绑定访问目录时回调函数。

用limbda表达式只会让 setup函数变得巨臃肿,效 ...

不不不,优势是有的,比如我有一个框架,里面只有一小部分代码要经常变,那么这方便了,不然,我代码里面要造几十个回调,要起函数名都头痛,更加别说要经常要传我的上下文变量下去了。

出200入2554汤圆

8
发表于 2022-1-10 10:04:09 | 只看该作者
xmlbb 发表于 2022-1-10 09:05
不不不,优势是有的,比如我有一个框架,里面只有一小部分代码要经常变,那么这方便了,不然,我代码里面 ...

也对,当匿名函数用;看样子得接收新事物

出0入0汤圆

9
 楼主| 发表于 2022-1-10 17:20:26 | 只看该作者
感谢楼上各位,不一一逐个回复了,看来C++ Primer Plus 的书是该买一本好好读一读了,光上面的疑问,网上一下子搜索不出来正确的答案。

出0入0汤圆

10
 楼主| 发表于 2022-1-10 17:22:22 | 只看该作者

谢谢古大师,无所不知啊

出0入0汤圆

11
 楼主| 发表于 2022-1-10 17:24:11 | 只看该作者
xmlbb 发表于 2022-1-10 09:05
不不不,优势是有的,比如我有一个框架,里面只有一小部分代码要经常变,那么这方便了,不然,我代码里面 ...

是啊,arduino类似的函数和类的相互交叉调用,api的调用时确实方便许多,但是深入看一下,头晕脑胀的

出0入618汤圆

12
发表于 2022-1-10 18:31:11 | 只看该作者
只能说隔行如隔山,匿名回调函数在Node.js之类的web后端框架很常用,C++用这种写法也是为了让web后端程序猿更容易转到嵌入式开发上面来。

Node.js写的hello world服务器:
  1. // Load HTTP module
  2. const http = require("http");

  3. const hostname = "127.0.0.1";
  4. const port = 8000;

  5. // Create HTTP server
  6. const server = http.createServer(function(req, res) {

  7.    // Set the response HTTP header with HTTP status and Content type
  8.    res.writeHead(200, {'Content-Type': 'text/plain'});

  9.    // Send the response body "Hello World"
  10.    res.end('Hello World\n');
  11. });

  12. // Prints a log once the server starts listening
  13. server.listen(port, hostname, function() {
  14.    console.log(`Server running at http://${hostname}:${port}/`);
  15. })
复制代码

出10入46汤圆

13
发表于 2022-1-17 09:47:43 | 只看该作者
C++的很多新语法。 就是垃圾。

用基本的语法 99.9% 的程序都可以实现。

出615入1076汤圆

14
发表于 2022-1-17 11:17:12 来自手机 | 只看该作者
gonboy 发表于 2022-1-17 09:47
C++的很多新语法。 就是垃圾。

用基本的语法 99.9% 的程序都可以实现。

100% 的 c++ 程序都可以用 c 實現

c++ 用戶只有兩個選擇:
1. 接受新語法
2. 放棄 c++

出0入0汤圆

15
发表于 2022-1-17 17:20:32 | 只看该作者
gonboy 发表于 2022-1-17 09:47
C++的很多新语法。 就是垃圾。

用基本的语法 99.9% 的程序都可以实现。

听说汇编也可以实现所有的需求,嗯,或许用二进制也可以。

出0入0汤圆

16
发表于 2022-1-17 18:25:30 | 只看该作者
C++ 的新语法,Lambda 表达式,当回调方法用的,

可以这么写,是不是就清楚一些呢:

auto my_callback = [&]() {
...
};

_server->on(path.c_str(),HTTP_POST,my_callback);

出0入0汤圆

17
 楼主| 发表于 2022-1-17 19:08:05 | 只看该作者
AppTurtle 发表于 2022-1-17 18:25
C++ 的新语法,Lambda 表达式,当回调方法用的,

可以这么写,是不是就清楚一些呢:

这种方式确实非常明确易读,不知道他们用Lambda的方式的目的能带来什么好处。

出0入0汤圆

18
发表于 2022-1-17 19:17:08 | 只看该作者
lambda 表达式是 C++11 最有用的特性之一了,替代回调函数指针只是用法之一,详细的找点资料看看吧,不是一两句能说清楚
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-5 06:19

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表