【问题标题】:Why is there a compile error in this code?为什么这段代码会出现编译错误?
【发布时间】:2011-12-27 02:34:59
【问题描述】:

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

【问题讨论】:

  • 你能发布最低可编译代码吗? (注释掉给你错误的部分)
  • 这甚至无法编译,因为LessThan 尚未在lessThanTest = &amp;LessThan; 之前声明
  • 这是 C 中的无效代码。您可以使用 c++ 和仿函数获得与 c# 中相同的结果。
  • @neagoegab -- 它不应该是有效的 C,也不是他的例子。阅读链接的问题以了解更多上下文。
  • 但它仍然是一个不完整规范的坏例子......闭包可以具有与仿函数相同的状态,而函数指针没有状态并且状态保持在全局变量中或传递为一个论点....

标签: c closures function-pointers


【解决方案1】:

这段代码有一些问题:

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

【讨论】:

    【解决方案2】:

    好吧,不,如果lessThan 是全局的,它不应该产生编译错误,尽管你很难通过这个片段来判断它应该在哪里。例如,lessThanTest=&amp;LessThan; 肯定来自某个本地范围。

    【讨论】:

      【解决方案3】:

      您错过了该答案中的一段:

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

      在您发布的内容中,int lessThan 并不意味着在全局范围内,它应该被假定在某个函数中。

      【讨论】:

      • 我认为那段是在谈论第二个代码sn-p
      • (我认为)两者都有。无论如何,在全局范围内,C 都不是严格有效的。
      • "我可以定义一个函数指针" ... "如果我想传递 this 函数指针"
      • 我不明白你的意思。如果lessThan 在全局范围内,则不会出现编译器错误(假设其余代码是正确的)。这两个示例都操作一个函数指针,第二个示例与第一个具有不同的对象生存期/可见性问题,但两者都有相同的基本问题 - C 没有闭包(或 lambdas,或嵌套函数),你需要自己实施解决方法。
      • 我的意思是,在闭包中可以做的事情可以使用函数指针和你说的一些解决方法来完成
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-19
        • 2012-05-07
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        相关资源
        最近更新 更多