有几个使用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
。
答案 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}}。