C/C++语言中闭包的探究及比较
(感谢投稿人 @思禽饮霜 )
这里主要讨论的是C语言的扩展特性block。该特性是Apple为C、C++、Objective-C增加的扩展,让这些语言可以用类Lambda表达式的语法来创建闭包。前段时间,在对CoreData存取进行封装时(让开发人员可以更简洁快速地写相关代码),我对block机制有了进一步了解,觉得可以和C++ 11中的Lambda表达式相互印证,所以最近重新做了下整理,分享给大家。
0. 简单创建匿名函数
下面两段代码的作用都是创建匿名函数并调用,输出Hello, World语句。分别使用Objective-C和C++ 11:
^{ printf("Hello, World!\n"); } ();
[] { cout << "Hello, World" << endl; } ();
Lambda表达式的一个好处就是让开发人员可以在需要的时候临时创建函数,便捷。
在创建闭包(或者说Lambda函数)的语法上,Objective-C采用的是上尖号^,而C++ 11采用的是配对的方括号[]。
不过“匿名函数”一词是针对程序员而言的,编译器还是采取了一定的命名规则。
比如下面Objective-C代码中的3个block,
#import <Foundation/Foundation.h> int (^maxBlk)(int , int) = ^(int m, int n){ return m > n ? m : n; }; int main(int argc, const char * argv[]) { ^{ printf("Hello, World!\n"); } (); int i = 1024; void (^blk)(void) = ^{ printf("%d\n", i); }; blk(); return 0; }
会产生对应的3个函数: