C语言中的闭包-这有用吗?
我开始学习函数式编程,想看看我是否可以用C语言编写闭包。为了重现第一个示例,我编写了以下代码:C语言中的闭包-这有用吗?,c,closures,C,Closures,我开始学习函数式编程,想看看我是否可以用C语言编写闭包。为了重现第一个示例,我编写了以下代码: #include <stdio.h> void closure (int(** f)(int), int *x) { int fcn(int y) { return *x + y; }; *f = fcn; } int main() { int x = 1; int(* f)(int); closure(&f,
#include <stdio.h>
void closure (int(** f)(int), int *x) {
int fcn(int y) {
return *x + y;
};
*f = fcn;
}
int main()
{
int x = 1;
int(* f)(int);
closure(&f, &x);
printf("%d", f(2));
return 0;
}
我遇到了分段错误?您的代码可以工作,因为gcc有一个支持嵌套函数的语言扩展 但是,在标准C中,不能在另一个函数中定义函数 如果您试图在包含函数退出后通过其地址调用嵌套函数,那么所有的麻烦都会发生。如果您试图在包含作用域级别退出后调用它,并且如果它引用了一些不再在作用域中的变量,那么您可能很幸运,但冒险是不明智的。但是,如果嵌套函数未引用超出范围的任何内容,则应该是安全的
首先,您的程序调用未定义的行为。这是因为函数
closure
中定义的函数fcn
是局部函数<代码>fcn一旦关闭
返回,就不再存在。因此,printf
调用
printf("%d", f(2));
通过调用f(2)
调用未定义的行为,因为f
指向不在范围内的函数fcn
C
语言没有闭包,这是因为C
中的函数不是一级对象。这意味着函数不能传递给其他函数,也不能从函数返回。实际传递或返回的是指向它的指针
请注意,嵌套函数和闭包之间存在差异。您看到的是的GCC扩展。这不是C标准的一部分。谢谢您的回复。我用一个不起作用的例子编辑了一个问题(很抱歉没有在前面发布)。。是否应该有一些内存问题,比如访问超出范围的局部变量或类似的东西?
printf("%d", f(2));