我试图了解闭包和函数指针之间的区别,我遇到了this answer in SO
我不明白的是这段代码
BOOL (*lessThanTest)(int);
int lessThan = 100;
lessThanTest = &LessThan;
BOOL LessThan(int i) {
return i < lessThan; // compile error - lessThan is not in scope
}
为什么有一个编译错误,考虑到lessThan是一个全局变量,可以从LessThan函数中访问它,我是否错过了什么?
修改
这不是我的代码,而是来自SO Function pointers, Closures, and Lambda
中的答案答案 0 :(得分:2)
闭包将其词法范围内的所有变量随之进行,可能延长其生命周期。函数指针不会 - 如果代码中引用的变量消失,它们就会被冲洗掉。
您给出的代码示例有点令人困惑。我相信它意味着在函数内部,这意味着lessThan
是一个局部变量。如果退出该范围,但函数指针仍然存在,则其代码将引用不存在的变量 - lessThan
。
答案 1 :(得分:1)
你错过了答案中的一段:
但是,现在我在评估它时必须传递2个参数。如果我希望将此函数指针传递给另一个函数,其中lessThan不在范围,我要么必须通过将其传递给链中的每个函数,或通过推广来手动保持它活着它是全球性的。
在你发布的内容中,int lessThan
并不意味着在全球范围内,应该假定它在某个地方的某个功能中。
答案 2 :(得分:0)
嗯,不,如果lessThan
是全局的,它不应该产生编译错误,尽管你很难通过这个片段告诉它是什么意思。例如,lessThanTest=&LessThan;
肯定来自某个本地范围。
答案 3 :(得分:0)
此代码存在一些问题:
lessThanTest
声明为未初始化的函数指针LessThan
。