C_and_CPP 板


LINE

各位先进好,小弟在C上遇到一个关於nested-function的疑惑想请教 以下是jserv大在他的网页中提到的一份sample code typedef int (*func_t)(int); static func_t(int arg) { int nested(int nested_arg) { return (arg + nested_arg); } return &nested; } int main() { { func_t = f(0x1ab); printf("%d\n", (*g)(20)); } printf("%d\n", f(400)(27)); printf("%d\n", f(f(400)(27))(20)); return 0; } 这样单纯传value的nested-function是没有问题的 小弟依样画葫芦,做了一个传function的版本,以下是小弟自己的code typedef void (*ret_func)(void); typedef void (*work_func)(void *data); void show_a(void *data) { printf("This is show_a function\n"); } void show_b(void *data) { printf("This is show_b function\n"); } ret_func func_gen(work_func func) { void inside_func(void) { printf("---------------\n"); (*func)(NULL); printf("---------------\n"); } return &inside_func; } int main() { ret_func ptr; ptr = func_gen(&show_a); (*ptr)(); return 0; } 以上是小弟的sample,不过却会直接的Segmentation fault 小弟想做的其实是动态将function再额外用另一个interface包起来 目的是不想让更外层的人去使用到底层的interface,所以才想说用这种方式 不过并不是很清楚死掉的原因,还请先进给予指点 谢谢 忘了说明,我是在Linux底下使用gcc 4.8.2的结果 -- 当你睁大眼睛却发现自己什麽都看不见的时候,不要以为是自己瞎了 或许,前方真的一无所有 --



※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 106.1.215.164
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1425644840.A.141.html ※ 编辑: godman362 (106.1.215.164), 03/06/2015 20:39:56
1F:→ carylorrk: C 什麽时候可以在 function 里 define function 了... 03/06 20:46
2F:→ carylorrk: 这看起来比较像是 Python 或 JS 之类的写法。 03/06 20:46
3F:→ littleshan: 因为 func_gen 在结束後,stack variable 就消灭了 03/06 20:47
4F:→ littleshan: 其中包含它的 function pointer 参数 03/06 20:48
5F:→ littleshan: 这就类似 return address of local variable 03/06 20:48
6F:→ littleshan: nested function 在 C 里面既不是标准,也不好用 03/06 20:48
7F:→ carylorrk: 或是像 C++ lambda 之类的有 closure 的写法 03/06 20:49
8F:→ littleshan: 真的想玩 closure 就去玩 C++11 的 lambda 吧 03/06 20:50
※ 编辑: godman362 (106.1.215.164), 03/06/2015 20:54:41 ※ 编辑: godman362 (106.1.215.164), 03/06/2015 20:55:33
9F:→ godman362: 那再请教,为什麽jserv大sample的arg(stack var)却没 03/06 20:57
10F:→ godman362: 消失呢? 03/06 20:57
11F:→ godman362: 因为我在做的project是C,所以才只能用C的解法 03/06 20:58
12F:→ godman362: 谢谢提供关於C++ closure的想法,我会去查看看 03/06 20:58
13F:→ carylorrk: 原来还真的有 nested function 的 extension 啊 没用过 03/06 21:26
14F:→ descent: gcc ext 的用法 03/06 22:21
15F:推 suhorng: 要参照一下 gnu extension 的文件 03/06 22:27
16F:→ carylorrk: 看了一下,我也想知道 jserv 的写法是正确的吗? 03/06 22:46
17F:→ carylorrk: 看起来唯一的差别就是原 PO 没有加 static,不过这应该 03/06 22:47
18F:→ carylorrk: 不会影响吧?(虽然在我的电脑上加了真的就可以跑了) 03/06 22:47
19F:推 NilPtr: ANIS C没有套层函数,Clang编译器跟GCC有提供扩展功能 03/07 16:30
20F:推 NilPtr: Jserv的程式是对的 但是要用这个GCC自订功能要加编译指令 03/07 16:40
21F:→ NilPtr: -std=gnu11 03/07 16:41
22F:→ godman362: 谢谢各位,我再找一下gcc extension的文件 03/07 20:48
23F:→ godman362: 另外,照N大的说法加上後,也是没办法动作 03/07 20:50
24F:推 NilPtr: 我研究了一会...GCC闭包内的指标跟上一层的指标会不同 03/08 01:55
25F:推 NilPtr: 说错 是一样的 但是原本的上层如果不在的话 才会是不同的 03/08 01:59
26F:→ NilPtr: 总之状态整个很怪 我猜跟函数的Stack空间有关系= = 03/08 02:02
27F:→ NilPtr: 以下测试结果 http://ideone.com/MRgw6L 03/08 02:15
28F:→ NilPtr: 另一个在同作用域呼叫却很正常 http://ideone.com/0dON2P 03/08 02:20
29F:→ NilPtr: "西屏 你怎麽看?" "宝杰! 这一定跟外星人有关" 03/08 02:22
30F:→ carylorrk: 我可以放弃吗?懒得研究非标准的东西XD 03/08 04:07
31F:→ godman362: 谢谢各位,因为我也打算换做法了 03/08 08:01
32F:→ godman362: 我在外国的论坛看到多数人对C的nested-function持反对 03/08 08:02
33F:→ godman362: 意见,而且也建议不要使用,所以我直接重想做法了 03/08 08:03







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:Boy-Girl站内搜寻

TOP