C 为什么这段代码中有编译错误?

C 为什么这段代码中有编译错误?,c,closures,function-pointers,C,Closures,Function Pointers,我试图理解闭包和函数指针之间的区别,我发现 我不明白的是这个代码 BOOL (*lessThanTest)(int); int lessThan = 100; lessThanTest = &LessThan; BOOL LessThan(int i) { return i < lessThan; // compile error - lessThan is not in scope } BOOL(*lessThanTest)(int); int-lessThan=10

我试图理解闭包和函数指针之间的区别,我发现

我不明白的是这个代码

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

lessThanTest = &LessThan;

BOOL LessThan(int i) {
   return i < lessThan; // compile error - lessThan is not in scope
}
BOOL(*lessThanTest)(int);
int-lessThan=100;
lessthanst=&LessThan;
布尔-莱斯特尚(国际一){
返回i
考虑到lessThan是一个全局变量,它可以从lessThan函数中访问,为什么会出现编译错误?我是否遗漏了什么

编辑


这不是我的代码,它来自于闭包中的一个答案,所以闭包会将其词法范围内的所有变量都带上,可能会延长它们的生命周期。函数指针没有——如果代码中引用的变量消失了,它们就被套住了


您给出的代码示例有点混乱。我认为它应该位于函数内部,这意味着
lessThan
是一个局部变量。如果该范围已退出,但函数指针仍然存在,则其代码将引用一个不存在的变量--
lessThan
您在该答案中遗漏了一段:

但是,现在我必须在计算它时传递这两个参数。如果我希望将此函数指针传递到lessThan不在范围内的另一个函数,我必须手动将其保持活动状态,方法是将其传递给链中的每个函数,,或者将其升级到全局


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

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

此代码存在一些问题:

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

您能发布最小的可编译代码吗?(注释掉给出错误的部分)甚至不会编译,因为
LessThan
之前还没有声明
lessthanst=&LessThan这是C.中的无效代码。您可以使用C++和函子实现与C语言相同的结果。@ NeigoGeAB——它不应该是有效的C,而不是他的例子。阅读链接问题了解更多上下文。但这仍然是一个不完整规范的坏例子。。。闭包可以具有与函子相同的状态,而函数指针没有状态,并且状态在全局变量中维护或作为参数传递……我认为该段落讨论的是第二个代码段(我认为),它同时讨论了这两个代码段。这两个函数在全局范围内都不是严格有效的
C
。“我可以定义一个函数指针”。。。“如果我想传递这个函数指针”我不明白你的意思。如果
lessThan
在全局范围内,则不会出现编译器错误(假设其余代码是正确的)。两个示例都操作函数指针,第二个示例与第一个示例有不同的对象生存期/可见性问题,但都有相同的基本问题-C没有闭包(或lambda,或嵌套函数),您需要自己实现变通方法。我的观点是,在闭包中可以做的事情可以使用函数指针和一些变通方法来完成,就像你说的那样