2011-09-11 108 views
2

有几个使用FSEvent来侦听文件系统中的更改的示例。在FSEventStreamCreate中声明回调函数

How to listen for file system changes MAC - kFSEventStreamCreateFlagWatchRoot

FSEvents weirdness on OS X Leopard

FSEventStreamCreate创建活动,他们似乎都经过回调项就好了。没有参数或任何东西,只是&feCallback。基本上看起来好像他们传递了一个变量而不是一个函数,如果这是有道理的话。

但是,当我尝试这样做时,出现Use of Undeclared identifier错误。是什么赋予了?

FSEventStreamRef stream = FSEventStreamCreate(NULL, 
                &feCallback, // what does '&' mean? Why are no parameters passed? 
                &cntxt, 
                pathsToWatch, 
                kFSEventStreamEventIdSinceNow, 
                1, 
                kFSEventStreamCreateFlagWatchRoot); 

,再后来有回调函数:

static void feCallback(ConstFSEventStreamRef streamRef, 
         void* pClientCallBackInfo, 
         size_t numEvents, 
         void* pEventPaths, 
         const FSEventStreamEventFlags eventFlags[], 
         const FSEventStreamEventId eventIds[]) 
{ 
     NSLog(@"The file changed!"); 
} 

我喜欢一些示例代码在这里得到开源辅助对象的工作:https://bitbucket.org/boredzo/fs-notifier/overview

但同样的事情。它具有方法:

- (id) initWithCallback:(FSEventStreamCallback)newCallback path:(NSString *)newPath;

,我不能将它传递一个newCallback因为上述错误的。

回答

2

当创建与FSEventStreamCreate事件时,他们似乎都通过回调项目就好了。没有参数或任何东西,只是&feCallback

FSEventStreamRef stream = FSEventStreamCreate(NULL, 
               &feCallback, // what does '&' mean? Why are no parameters passed? 

&是算子“的地址”,并计算结果为指向其操作数。这里并不是真的有必要。不在函数调用中的函数名称始终计算为指向函数的指针,有或没有&

因此,它将指针传递给feCallback函数,这是FSEventStream对象将如何回调它的方式。

基本上看起来好像他们传递的是变量而不是函数,如果这样做有道理的话。

这确实有道理,但不,这是不正确的。他们正在传递函数本身。

可以声明一个包含指向函数的指针的变量。如果feCallback是这样一个变量,那么feCallback&feCallback意味着不同的事情:feCallback将是指向该函数的指针(在feCallback变量内),而&feCallback将是指向该变量的指针。

在你的情况下,虽然feCallback是一个函数,但这两个表达式是等价的;以任何方式传递函数指针。

但是,当我尝试去使用未声明的标识符错误时,是什么赋予了?

您还没有声明该标识符(在本例中是该函数)。

,再后来有回调函数:

这就是问题所在。您在使用名称后定义了回调函数,但是您没有在之前使用其名称声明函数。您必须先声明该功能,然后才能使用它(或将它传递到任何地方)。

原因是因为编译器不知道“feCallback”是什么,直到您告诉它,这是声明的作用。当您在声明或定义它之前尝试引用“feCallback”时,编译器不知道您在说什么。

另一种方法是将函数的定义向上移动。定义被视为对其后的所有内容的声明。尽管如此,我会把它定义在原来的位置,然后在文件顶部附近添加一个声明。

无论采用哪种方式,编译器都会知道feCallback是什么时候将其传递给FSEventStreamCreate

+0

呵呵。我从来没有想到,简单地重新排序实际功能会使这项工作成为可能。我认为我需要以某种方式“创建”这个功能,我显然遇到了麻烦。如果你在'FSEventStreamCreate'的方法上面写了'static void feCallback'位,那么一切正常。猜猜这是一个来自Java/C#背景(所有这些都是自动完成的)的地方,对于Obj-C来说有点痛苦。 :) 谢谢您的帮助。 – cksubs