我刚刚学习了函数指针,在阅读K&关于这个话题,我首先想到的是,"嘿,这有点像一个结束."我知道这个假设在某种程度上根本是错误的,在网上搜索之后,我没有找到任何关于这个比较的分析.

那么,为什么C风格的函数指针与闭包或lambda有根本的不同呢?据我所知,这与函数指针仍然指向已定义(命名)的函数这一事实有关,而不是匿名定义函数的做法.

为什么在第二种情况下,将函数传递给一个被视为更强大的函数,在第二种情况下,它是未命名的,而在第一种情况下,它只是一个普通的日常函数,正在被传递?

请告诉我,我如何以及为什么错误地将两者进行如此密切的比较.

谢谢.

推荐答案

lambda(或closure)封装函数指针和变量.这就是为什么在C#中,您可以执行以下操作:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
   return i < lessThan;
};

我在那里使用了一个匿名委托作为闭包(与lambda等效项相比,它的语法更清晰、更接近于C),它将less Than(堆栈变量)捕获到闭包中.在计算闭包时,将继续引用less Than(其堆栈帧可能已被销毁).如果我更改less Than,则更改比较:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
   return i < lessThan;
};

lessThanTest(99); // returns true
lessThan = 10;
lessThanTest(99); // returns false

在C中,这是非法的:

BOOL (*lessThanTest)(int);
int lessThan = 100;

lessThanTest = &LessThan;

BOOL LessThan(int i) {
   return i < lessThan; // compile error - lessThan is not in scope
}

虽然我可以定义一个包含两个参数的函数指针:

int lessThan = 100;
BOOL (*lessThanTest)(int, int);

lessThanTest = &LessThan;
lessThanTest(99, lessThan); // returns true
lessThan = 10;
lessThanTest(100, lessThan); // returns false

BOOL LessThan(int i, int lessThan) {
   return i < lessThan;
}

但是,现在我必须在计算它时传递这两个参数.如果我希望将这个函数指针传递给lessThan不在作用域中的另一个函数,我要么将其传递给链中的每个函数,要么将其升级为全局函数,从而手动使其保持活动状态.

尽管大多数支持闭包的主流语言都使用匿名函数,但这并没有要求.可以使用不带匿名函数的闭包,也可以使用不带闭包的匿名函数.

摘要:闭包是函数指针+捕获变量的组合.

C++相关问答推荐

ATmega328P USART发送字符重复打印

C中的__attributor__((aligned(4),packed))与 struct 的用法

为什么在函数内部分配内存空间时需要添加符号?

为什么GCC在每次循环迭代时都会生成一个数组的mov&S使用[]访问数组?(-03,x86)

在列表中插入Int指针(C)

在C语言中,是否可以使枚举数向后计数?

为什么此共享库没有预期的依赖项?

I2C外设在单次交易后出现故障

<;unistd.h>;和<;sys/unistd.h>;之间有什么区别?

为什么Fread()函数会读取内容,然后光标会跳到随机位置?

通过描述符查找文件路径时出现问题

当b是无符号字符时,int a=(b<;<;2)>;>;2;和int a=b&;0x3F;之间有什么区别?

仅从限制指针参数声明推断非混叠

我在C程序的Flex/Bison中遇到语法错误

基于蝶数恰好有8个除数的事实的代码

哪个首选包含第三个库S头文件?#INCLUDE;文件名或#INCLUDE<;文件名&>?

';malloc():损坏的顶部大小';分配超过20万整数后

为什么<到达*时不会转换为>?

通过修改c中的合并排序对数组的偶数索引进行排序

返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?