为什么此代码中存在编译错误?

时间:2011-11-11 15:05:36

标签: c closures function-pointers

我试图了解闭包和函数指针之间的区别,我遇到了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

中的答案

4 个答案:

答案 0 :(得分:2)

闭包将其词法范围内的所有变量随之进行,可能延长其生命周期。函数指针不会 - 如果代码中引用的变量消失,它们就会被冲洗掉。

您给出的代码示例有点令人困惑。我相信它意味着在函数内部,这意味着lessThan是一个局部变量。如果退出该范围,但函数指针仍然存在,则其代码将引用不存在的变量 - lessThan

答案 1 :(得分:1)

你错过了答案中的一段:

  

但是,现在我在评估它时必须传递2个参数。如果我希望将此函数指针传递给另一个函数,其中lessThan不在范围,我要么必须通过将其传递给链中的每个函数,或通过推广来手动保持它活着它是全球性的

在你发布的内容中,int lessThan并不意味着在全球范围内,应该假定它在某个地方的某个功能中。

答案 2 :(得分:0)

嗯,不,如果lessThan是全局的,它不应该产生编译错误,尽管你很难通过这个片段告诉它是什么意思。例如,lessThanTest=&LessThan;肯定来自某个本地范围。

答案 3 :(得分:0)

此代码存在一些问题:

  • 您将lessThanTest声明为未初始化的函数指针
  • 以后不能在全局范围内为其分配内容
  • 您在宣布之前使用LessThan