2

有几个使用 FSEvent 来监听文件系统变化的例子。

如何侦听文件系统更改 MAC - kFSEventStreamCreateFlagWatchRoot

OS X Leopard 上的 FSEvents 怪异

当使用它们创建事件时,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由于上述错误,我无法通过它。

4

1 回答 1

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作为一个函数,这两个表达式是等价的;无论哪种方式都传递函数指针。

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

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

然后有回调函数:

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

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

另一种方法是将函数的定义向上移动。定义算作对其后面所有内容的声明。不过,我会将定义保留在原处,只需在文件顶部附近添加一个声明。

无论哪种方式,编译器都会知道feCallback你将它传递给FSEventStreamCreate.

于 2011-09-11T16:40:07.033 回答