C语言中闭包的探究及比较

C语言中闭包的探究及比较

ID:46847712

大小:63.50 KB

页数:14页

时间:2019-11-28

C语言中闭包的探究及比较_第1页
C语言中闭包的探究及比较_第2页
C语言中闭包的探究及比较_第3页
C语言中闭包的探究及比较_第4页
C语言中闭包的探究及比较_第5页
资源描述:

《C语言中闭包的探究及比较》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言中闭包的探究及比较这里主要讨论的是C语言的扩展特性blocko该特性是Apple为C、C++、Objective-C增加的扩展,让这些语言可以用类Lambda表达式的语法來创建闭包。前段时间,在对CoreData存取进行封装时(让开发人员可以更简洁快速地写相关代码),我对block机制有了进一步了解,觉得可以和C++11中的Lambda表达式相互印证,所以最近重新做了下整理,分亭给大家。0.简单创建匿名函数下血两段代码的作用都是创建匿名函数并调用,输出Hello,World语句。分别使用Objective-C和C++11:[cpp]A{printf("Hello,World!H)

2、;}();[cpp]viewplaincopy[]{cout«"Hello,World"«endl;}();Lambda表达式的一个好处就是让开发人员可以在需要的时候临时创建函数,便捷。在创建闭包(或者说Lambda函数)的语法上,Objective-C采用的是上尖号人,而C++11采用的是配对的方括号[]。不过“匿名函数”一词是针对程序员而言的,编译器还是采取了一定的命名规则。比如下面Objective-C代码中的3个block,[cpp]#importvFoundation/Foundation.h>int(AmaxBlk)(int,int)=八(intm,intn){returnm>

3、n?m:n;};intmain(intargc,constchar*argv[]){A{printf(nHello,World!n);}();inti二1024;void(Ablk)(void)=A{printf("%d",i);};blk();return0;}会产牛对应的3个苗数:[cpp]_maxBlk_block」unc_0_main_block_func_0_main_block_func_l可见函数的命名规则为:_{$Scope}_block_func_{$index}c其中{$Scope}为block所在函数,如果{$Scope}为全局就取block本身的名称;{$i

4、ndex}表示该block在{$Scope}作川域内出现的顺序(笫几个block)o1.从语法上看如何捕获外部变量在上而的代码中,已经看到“匿名函数”可以直接访问外围作川域的变量i:[cpp]inti=1024;void(Ablk)(void)=A{printf("%d",i);};blk();当匿名函数和non-local变量结合起來,就形成了闭包(个人看法)。这一段代码可以成功输出i的值。我们把一样的逻辑搬到C++上:[cpp]inti=1024;autofunc=[]{printf(ll%d,l/i);};func();GCC会输出:错误:'i'未被捕获。口J见在C++中无法

5、直接捕获外围作用域的变量。以BNF来表示Lambda表达式的上下文无关文法,存在:[cpp]lambda-expression:lambda-introducerlambda-parameter-declarationoptcompound-statementlambda-introducer:[lambda-captureopt]因此,方括号中还可以加入一些选项:[cpp][]Capturenothing(or;ascorchedearthstrategy?)[&]Captureanyrefereneedvariablebyreferenee[=]Captureanyrefereneed

6、variablebymakingacopy[=,&foo]Captureanyrefereneedvariablebymakingacopy,butcapturevariablefoobyreferenee[bar]Capturebarbymakingacopy;don'tcopyanythingelse[this]Capturethethispointeroftheenclosingclass根据文法,对代码加以修改,使其能够成功运行:[cpp]bash・3.2#vitestLambda.cppbash-3.2#g++47-std=c++lltestLambda.cpp-otestLam

7、bdabash-3.2#・/testLambdabash-3.2#cattestLambda.cpp#includeusingnamespacestd;intmain(){inti=1024;autofunc=[=]{printf("%d",i);};func();return0;}bash-3.2#1.从语法上看如何修改外部变量上面代码屮使川了符号二,通过拷贝方式捕获了外部变量i。但是如果尝试在

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。