码迷,mamicode.com
首页 > 编程语言 > 详细

C语言实现匿名函数

时间:2015-07-20 21:20:57      阅读:854      评论:0      收藏:0      [点我收藏+]

标签:

在C语言中可以通过宏定义的方式实现匿名函数,具体如下:

1
2
3
4
5
6
#define lambda(return_type, function_body) \
({ \
      return_type $this function_body \
          $this; \
})
#define $ lambda

该定义利用了GCC对C语言的扩展(被一对花括号包起来的代码块能够返回一个值),该宏定义能够返回$this(函数指针),如果我们需要一个返回两整数的和的函数,那么我们还可以对该宏再做一次封装,如下:

1
#define add2int(function_body) $(int, (int _a, int _b){function_body})

然后我们就可以像下面这样来使用该宏(求一个整型数组所有元素的和):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int sum(int *arr, int length, int (*add)(int, int));
int main(int argc, char **argv)
{
    int arr[] = { [0 ... 9] = 1, [10 ... 89] = 2, [90 ... 99] = 3 };
    int ret = sum(arr, sizeof(arr)/sizeof(int), add2int(int c = _a + _b; return c;));
    //add2int返回一个求两个整数和的函数
 
    printf("sum of arr is %d\n", ret);
}
int sum(int *arr, int length, int (*add)(int, int))
{
    int sum = 0;
    for (int i=0; i < length; i++)
    {
        sum = add(sum, arr[i]);
    }
    return sum;
}

当然也可以直接使用lambda宏,注意function_body需要包含函数的返回类型及参数列表,将上面第6行代码替换为:

1
2
3
4
int ret = sum(arr, sizeof(arr)/sizeof(int), $(int, (int _a, int _b){
    int c = _a + _b;
    return c;
});

当然这样的代码肯定是效率低下,而且多此一举,这里只是简单的举个例子





C语言实现匿名函数

标签:

原文地址:http://www.cnblogs.com/eben-yl/p/4662567.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!