免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: davelv
打印 上一主题 下一主题

C语言对闭包运算的支持 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2011-12-01 16:10 |只看该作者
本帖最后由 tony_ayuan 于 2011-12-01 16:21 编辑

ps:

嵌套函数定义的语法,GNU C支持,linux kernel C支持,而VC 不支持。

也不是C99标准。

此外,嵌套函数的存储位置在调用栈上,是动态分配的,因此不能为static。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
22 [报告]
发表于 2011-12-01 17:40 |只看该作者
回复 17# davelv

汗…… 我只知道Windows怎么开启关闭DEP

如果mmap(... , PROC_EXEC), mprotect... 不行,无论DEP是否开启, 那就不是我能力范围之内的事了

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
23 [报告]
发表于 2011-12-01 17:46 |只看该作者
GCC 现在支持C语言里面函数定义函数了。

论坛徽章:
0
24 [报告]
发表于 2011-12-01 18:08 |只看该作者
回复 20# fallening

歪了。
不过我敢肯定你的不是最简单的。
  1. int main(){[](){}();}
复制代码

论坛徽章:
0
25 [报告]
发表于 2011-12-01 19:02 |只看该作者
回复 22# tony_ayuan
C89和C99都不支持。我前面也说了,ISO C不支持。

嵌套函数本身没有存在栈上,而是处理函数传参的一些代码保存在了栈上。

还有闭包,只能说是支持部分闭包特性,不能作为把嵌套函数作为返回值传给其它函数直接调用,只能在当前函数内部使用,这点前面OWO兄提到了。

论坛徽章:
0
26 [报告]
发表于 2011-12-01 19:05 |只看该作者
回复 24# OwnWaterloo

这个DEP问题还待好好研究下。
话说我在windows上也让朋友测试了,开启DEP仍旧可以运行。

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
27 [报告]
发表于 2011-12-01 21:52 |只看该作者
回复 28# davelv

要么是gcc实现方式改了……
要么是DEP开启貌似要重启后才生效, 你同学重启了么……

我这里就崩了……

论坛徽章:
0
28 [报告]
发表于 2011-12-02 03:48 |只看该作者
回复  fallening

歪了。
不过我敢肯定你的不是最简单的。
幻の上帝 发表于 2011-12-01 18:08


呵呵,我也可以肯定你的不是最简单的
  1. int main(){[]{}();}
复制代码

论坛徽章:
0
29 [报告]
发表于 2011-12-02 11:00 |只看该作者
本帖最后由 KanonInD 于 2011-12-02 11:06 编辑
回复  tony_ayuan
C89和C99都不支持。我前面也说了,ISO C不支持。

嵌套函数本身没有存在栈上,而是处 ...
davelv 发表于 2011-12-01 19:02


"不能作为把嵌套函数作为返回值传给其它函数直接调用,只能在当前函数内部使用" 具体是什么意思?
[t@myhost ~]$ cat b.c
#include <stdio.h>

void* f()
{
  void g()
  {
    static int i;
    printf("%i\n", ++i);
    puts("abc");
  }
  puts(" ");
  return g;
}

int main()
{
  void* (*foo)() = f;
  void* (*z)() = (*foo)();
  (*z)();
  (*z)();
}
[t@myhost ~]$ gcc b.c
[t@myhost ~]$ ./a.out

1
abc
2
abc
[t@myhost ~]$

论坛徽章:
0
30 [报告]
发表于 2011-12-02 12:56 |只看该作者
回复 31# KanonInD

就是说受限于upvalue(内嵌函数使用的外部函数局域变量)的作用域。

你这个例子没什么用,你把嵌套函数写到文件级别也没有任何影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP