C语言实现匿名函数

在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;

});

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

来自为知笔记(Wiz)

时间: 2024-10-24 23:13:58

C语言实现匿名函数的相关文章

[日常] Go语言圣经-匿名函数习题2

练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面.只保存来自原始域名下的页面.假设初始页面在golang.org下,就不 要保存vimeo.com下的页面. package main import ( "fmt" "io" "io/ioutil" "links" "log" "net/http" "net/url" "

PHP匿名函数及闭包

匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了, 目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数,C++的新标准C++0x也开始支持了. 匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数,最常见应用是作为回调函数. 闭包(Closure) 说 到匿名函数,就不得不提到闭包了,闭包是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数,

javascript匿名函数的各种执行形式

近期在研究Pomelo源码,这个框架基于Node.js,所以非要频繁地与JavaScript脚本打交道不可.因此,本文中我们来总结 javascript语言中匿名函数的主要目的及各种存在形式.其实,匿名函数在许多语言中都有提供,这个词语各位应该不陌生. 一.函数与匿名函数        首先,我们来看一下在javascript中正常函数定义的语法: function functionname(var1,var2,...,varX) {     //...函数体 } 如上所示,正常函数的定义需要一

Golang之匿名函数和闭包

Go语言支持匿名函数,即函数可以像普通变量一样被传递或使用. 使用方法如下: main.go package main import ( "fmt" ) func main() { var v func(a int) int v = func(a int) int { return a * a } fmt.Println(v(6)) //两种写法 v1 := func(i int) int { return i * i } fmt.Println(v1(7)) } GO语言的匿名函数就

GO 之匿名函数、闭包

匿名函数 go语言支持匿名函数,即像普通变量一样被引用或者传递 func main(){ var v func(a int) int v = func(a int) int { return a*a } fmt.Println(v(5)) //另一种写法 s := func(a int) int { return a*a } fmt.Println(s(7)) } GO语言的匿名函数就是闭包,<go语言编程>中对闭包的解释是: 基本概念闭包是:可以包含自由(未绑定到特定对象)变量的代码块,这些

dart语言匿名函数与=&gt;语法

dart语言匿名函数与=>语法 => expr 等同于{ return expr; } 匿名函数的参照如下: ([[Type] param1[, -]]) { codeBlock; }; 例子 (context) => HomePage(widget.isDark, themeChanger) 上面的语句翻译过来就是 func_name(context){return HomePage(widget.isDark, themeChanger);} 原文地址:https://www.cnb

【夯实PHP系列】购物车代码说明PHP的匿名函数

1. 定义:匿名函数(Anonymous functions),也叫闭包函数(closures),允许 临时创建一个没有指定名称的函数.最经常用作回调函数(callback)参数的值.当然,也有其它应用的情况. 2. 用法: 1)作为变量的值: 闭包函数也可以作为变量的值来使用.PHP 会自动把此种表达式转换成内置类 Closure 的对象实例.把一个 closure 对象赋值给一个变量的方式与普通变量赋值的语法是一样的,最后也要加上分号 2)从父作用域继承变量: 闭包可以从父作用域中继承变量.

Javascript的匿名函数与自执行

函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 函数的定义,大致可分为三种方式: 第一种:这也是最常规的一种 1 2 3 function double(x){        return 2 * x;       } 第二种:这种方法使用了Function构造函数,把参数列表和函数体都作为字符串,很不方便,不建议使用. 1 var double = new Function('x', 'return 2 * x;'); 第三种: 1

在NewLisp中实现匿名函数的递归

匿名函数在很多语言中的表现形式大概如下: (lambda (n)   (* (+ n 1) (- n 1))) 只有参数列表和函数体,而没有名字.在大部分情况下没问题,但是一旦需要用到递归的话,就有点麻烦了,因为不知道如何去递归的调用一个匿名函数. 在学术界中有一些解决这个问题的办法,其中一个就是Y组合子,但是那个太繁琐,而且难以通过宏自动将一个lambda变成可递归形式,没什么好处. 根据历史经验,目前比较好的办法,就是实现一个操作符,匿名函数通过这个操作符来调用自身: (lambda (n)