先来啰嗦几句,身边的朋友,同事都喜欢在博客上记录本身在学习计算机编程技术路程上的一些问题和心得。就我我的而言,这是个好习惯,特别是在计算机编程领域,技术方向种类繁多,永无止境。因此,我也开始我人生中第一份博客,但愿看到的朋友多多鼓励和讨论,在此谢过。对于计算技术,越是深刻越越数学挂钩,想达到大神级别,嗯,我是有自知之明的。计算机技术虽然之多,并不须要咱们每个领域每一项技术都特别的精通。固然,能作到,我由衷的佩服和羡慕,只要咱们专一于某些技术领域并能达到“精通”两个字就已经很不容易,毕竟精神和身体耗损太大,通常人难以达到一应俱全。我的特别喜欢C语言,用其研发已有6年多的时间,一直很热衷。下面就由读者和我一块儿来看看使用C语言实现Lambda表达式(gcc编译器)。编程
“Lambda 表达式”(Lambda Expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式能够表示闭包(注意和数学传统意义上的不一样)。服务器
C语言实现Lambda表达式,通常来讲都是经过宏定义来的,这样就可使用相似Lambda(...)这样形式,请看下面:网络
#define cgs_lambda( return_type, function_body) \闭包
({return_type cgs_lambda_func function_body cgs_lambda_func;})框架
上述,就是Lambda表达式的宏定义,“cgs_”前缀是我在本身的项目中使用的,不是重点。重点在于( return_type, function_body)使用在({return_type cgs_lambda_func function_body cgs_lambda_func;})语句,return_type为返回类型,function_body为Lambda表达式中匿名函数的函数体。注意,中间cgs_lambda_func其实就是匿名的函数名,最后的cgs_lambda_func的做用表示函数的地址就定义在此,如何使用cgs_lambda表达式,咱们经过一个简单的实例作进一步分析。函数
完整代码以下:学习
#include <stdio.h>测试
/** 这里是咱们定义的Lambda表达式的宏定义 */翻译
#define cgs_lambda( return_type, function_body) \作用域
({return_type cgs_lambda_func function_body cgs_lambda_func;})
/*************************** 测试Main **************************/
int main( int argc, const char **argv)
{
/** 咱们作两个数相加的操做 */
printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ return x + y; })(3, 4) );
return 0;
}
能够经过编译和运行试试,运行结果为:Sum = 7
好了,咱们来说解一下,return_type为int型,function_body为带两个入参的函数体(int x, int y){ return x + y; },后面的(3, 4)就是咱们调用cgs_lambda_func传的入参。这样应该知道cgs_lambda表达式中最有一个“cgs_lambda_func;”的做用了,别忘了末尾的分号“;",不然编译不过去的。
咱们来翻译上述咱们示例中的cgs_lambda表达式编译事后是什么样子,以下:
({int cgs_lambda_func (int x, int y){ return x + y; } cgs_lambda_func;})(3, 4)
简单剖析,“函数声明--->当即传参调用”,代码块由“({”和“})”括住,其实做用域也就是仅限于“({”和“})”之间,达到局部的做用。引入访问外部变量的例子:
#include <stdio.h>
/** 这里是咱们定义的Lambda表达式的宏定义 */
#define cgs_lambda( return_type, function_body) \
({return_type cgs_lambda_func function_body cgs_lambda_func;})
/*************************** 测试Main **************************/
int main( int argc, const char **argv)
{
int a = 1;
/** 咱们作两个数相加的操做 */
printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ a++; return x + y; })(a, 4) );
printf( "a = %d\n", a);
return 0;
}
很是感谢读者的耐心细读,我会慢慢更新个人博客,也会作好个人博客,最近本身在忙于写网络服务器方面的小型框架,谢谢您的关注,祝您身体健康,万事如意。