[问题] C nested-function

楼主: godman362 (萧青)   2015-03-06 20:27:08
各位先进好,小弟在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("
作者: carylorrk (carylorrk)   2015-03-06 20:46:00
C 什么时候可以在 function 里 define function 了...这看起来比较像是 Python 或 JS 之类的写法。
作者: littleshan (我要加入剑道社!)   2015-03-06 20:47:00
因为 func_gen 在结束后,stack variable 就消灭了其中包含它的 function pointer 参数这就类似 return address of local variablenested function 在 C 里面既不是标准,也不好用
作者: carylorrk (carylorrk)   2015-03-06 20:49:00
或是像 C++ lambda 之类的有 closure 的写法
作者: littleshan (我要加入剑道社!)   2015-03-06 20:50:00
真的想玩 closure 就去玩 C++11 的 lambda 吧
楼主: godman362 (萧青)   2015-03-06 20:57:00
那再请教,为什么jserv大sample的arg(stack var)却没消失呢?因为我在做的project是C,所以才只能用C的解法谢谢提供关于C++ closure的想法,我会去查看看
作者: carylorrk (carylorrk)   2015-03-06 21:26:00
原来还真的有 nested function 的 extension 啊 没用过
作者: descent (“雄辩是银,沉默是金”)   2015-03-06 22:21:00
gcc ext 的用法
作者: suhorng ( )   2015-03-06 22:27:00
要参照一下 gnu extension 的文件
作者: carylorrk (carylorrk)   2015-03-06 22:46:00
看了一下,我也想知道 jserv 的写法是正确的吗?看起来唯一的差别就是原 PO 没有加 static,不过这应该不会影响吧?(虽然在我的电脑上加了真的就可以跑了)
作者: NilPtr (神奇的空指标)   2015-03-07 16:30:00
ANIS C没有套层函数,Clang编译器跟GCC有提供扩展功能Jserv的程式是对的 但是要用这个GCC自订功能要加编译指令-std=gnu11
楼主: godman362 (萧青)   2015-03-07 20:48:00
谢谢各位,我再找一下gcc extension的文件另外,照N大的说法加上后,也是没办法动作
作者: NilPtr (神奇的空指标)   2015-03-08 01:55:00
我研究了一会...GCC闭包内的指标跟上一层的指标会不同说错 是一样的 但是原本的上层如果不在的话 才会是不同的总之状态整个很怪 我猜跟函数的Stack空间有关系= =以下测试结果 http://ideone.com/MRgw6L另一个在同作用域呼叫却很正常 http://ideone.com/0dON2P"西屏 你怎么看?" "宝杰! 这一定跟外星人有关"
作者: carylorrk (carylorrk)   2015-03-08 04:07:00
我可以放弃吗?懒得研究非标准的东西XD
楼主: godman362 (萧青)   2015-03-08 08:01:00
谢谢各位,因为我也打算换做法了我在外国的论坛看到多数人对C的nested-function持反对意见,而且也建议不要使用,所以我直接重想做法了

Links booklink

Contact Us: admin [ a t ] ucptt.com