gcc 匿名函数 - 哆啦比猫的技术瞎扯 - Arch Linux · ドラえもん · 实时绘制
gcc 匿名函数
看了一下 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-2019.
本作品采用知识共享署名·非商业性使用·相同方式共享 3.0 中国大陆许可协议进行许可。
文中凡未特殊声明且未声明为引用的代码均以 MIT 协议授权。
blog comments powered by Disqus