在FSEventStreamCreate中声明回调函数

时间:2011-09-11 09:39:00

标签: objective-c macos fsevents

有几个使用FSEvent侦听文件系统更改的示例。

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

1 个答案:

答案 0 :(得分:2)

  

使用FSEventStreamCreate创建活动时,他们似乎都可以正常传递回调项。没有参数或任何内容,仅&feCallback

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

&是“address of”运算符,并求值为指向其操作数的指针。这不是必要的;不在函数调用中的函数名总是求值为指向函数的指针,有或没有&

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

  

基本上,似乎他们传递变量而不是函数,如果这是有道理的。

这确实有道理,但不,这不正确。他们正在传递这个功能。

可以声明一个包含指向函数的指针的变量。如果feCallback是这样的变量,则feCallback&feCallback将表示不同的内容:feCallback将是指向函数的指针(在feCallback变量内) ,而&feCallback将是指向变量的指针。

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

  

但是当我尝试使用时,我正在使用未声明的标识符错误。是什么给了什么?

您尚未声明该标识符(在本例中为该函数)。

  

然后再使用回调函数:

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

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

另一种方法是移动函数的定义。定义计为其后所有内容的声明。不过,我会将定义留在原来的位置,只需在文件顶部附近添加一个声明即可。

无论哪种方式,编译器都会知道将feCallback传递给FSEventStreamCreate时的{{1}}。