gcc 匿名函数 - 哆啦比猫's Blog - I'm an ArchLinuxer

gcc 匿名函数

哆啦比猫 posted @ 2013年1月20日 11:59 in C/C++ with tags c function gcc lambda , 1953 阅读

看了一下 GCC Extentions 的手册,发现了点东西,利用这些东西终于可以实现我幻想很久的匿名函数了!

最主要的是这个:Statements and Declarations in Expressions

简单地说,就是可以在表达式里写语句和声明(废话,这不就是把上面那英文翻译一下么……),这样就可以实现在一个表达式里定义一个函数,然后返回函数指针了。

#include <stdio.h>

void output(int x, int f(int x))
{
	printf("%d\n", f(x));
}

int main()
{
	output(3, ({
		int __lambda(int x)
		{
			return x + 1;
		}
		&__lambda;
	}));
	return 0;
}

但是,__lambda 这个名字太渣了,而且这样写还是太麻烦了。

GCC Extensions 的手册说,“Dollar sign is allowed in identifiers.”,所以:

#include <stdio.h>

#define $(ret,def)	({ret $$ def &$$;})

void output(int x, int f(int x))
{
	printf("%d\n", f(x));
}

int main()
{
	output(3, $(int, (int x) {
			return x + 1;
		}));
	return 0;
}

用 \$ 创建一个匿名函数,函数名为 \$\$。

但是这个“\$”是不能随便乱用的。在这里由于有优化,“\$\$”不会进入汇编语言。但是如果在一些公开符号中用“\$”,会因为汇编失败导致编译失败。

这样实现的匿名函数会有一个问题:没有闭包。这样,如果是作为回调函数的话,访问上层函数的局部变量是会出错的。


凡未特殊声明(转载/翻译),所有文章均为原创。
by Giumo Xavier Clanjor (哆啦比猫/兰威举), 2010, 2011, 2012, 2013, 2014, 2015-2016 and 2017.
知识共享许可协议本作品采用知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议进行许可。
文中凡未特殊声明且未声明为引用的代码均以 MIT 协议授权。

blog comments powered by Disqus
© 2010, 2011, 2012, 2013, 2014, 2015-2016 and 2017 Giumo Xavier Clanjor (哆啦比猫/兰威举).
© 2013, 2014, 2015-2016 and 2017 The Dark Colorscheme Designed by Giumo Xavier Clanjor (哆啦比猫/兰威举).
知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议
| © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee