问题
There are a couple examples of using an FSEvent to listen for changes in the file system.
How to listen for file system changes MAC - kFSEventStreamCreateFlagWatchRoot
and
FSEvents weirdness on OS X Leopard
When creating the event with FSEventStreamCreate
they all seem to pass the callback item just fine. No parameters or anything, just &feCallback
. Basically it seems as if they're passing a variable rather than a function, if that makes sense.
But I'm getting a Use of Undeclared identifier
error when I try to do it. What gives?
FSEventStreamRef stream = FSEventStreamCreate(NULL,
&feCallback, // what does '&' mean? Why are no parameters passed?
&cntxt,
pathsToWatch,
kFSEventStreamEventIdSinceNow,
1,
kFSEventStreamCreateFlagWatchRoot );
and then later have the callback function:
static void feCallback(ConstFSEventStreamRef streamRef,
void* pClientCallBackInfo,
size_t numEvents,
void* pEventPaths,
const FSEventStreamEventFlags eventFlags[],
const FSEventStreamEventId eventIds[])
{
NSLog(@"The file changed!");
}
I'd love some sample code to get the open-source helper object here working: https://bitbucket.org/boredzo/fs-notifier/overview
But same thing. It has the method:
- (id) initWithCallback:(FSEventStreamCallback)newCallback path:(NSString *)newPath;
and I can't pass it a newCallback
because of the error described above.
回答1:
When creating the event with
FSEventStreamCreate
they all seem to pass the callback item just fine. No parameters or anything, just&feCallback
.FSEventStreamRef stream = FSEventStreamCreate(NULL, &feCallback, // what does '&' mean? Why are no parameters passed?
The &
is the “address of” operator, and evaluates to a pointer to its operand. It's not really necessary here; a function name not in a function call always evaluates to the pointer to the function, with or without &
.
So this passes the pointer to the feCallback
function, which is how the FSEventStream object will call it back.
Basically it seems as if they're passing a variable rather than a function, if that makes sense.
That does make sense, but no, that's not correct. They are passing the function itself.
It is possible to declare a variable that holds a pointer to a function. If feCallback
were such a variable, then feCallback
and &feCallback
would mean different things: feCallback
would be the pointer to the function (inside the feCallback
variable), whereas &feCallback
would be the pointer to the variable.
In your case, though, with feCallback
being a function, the two expressions are equivalent; either way passes the function pointer.
But I'm getting a Use of Undeclared identifier error when I try to do it. What gives?
You haven't declared that identifier (in this case, that function).
and then later have the callback function:
That's the problem. You have the callback function defined after your use of its name, but you did not declare the function before using its name. You must declare the function before you can use it (or pass it anywhere).
The reason is because the compiler doesn't know what “feCallback
” is until you tell it, which is what the declaration does. When you try to refer to “feCallback
” before declaring or defining it, the compiler doesn't know what you're talking about.
The other way would be to move the function's definition up. A definition counts as a declaration for everything that follows it. I'd leave the definition where it is, though, and just add a declaration near the top of the file.
Either way, then the compiler will know what feCallback
is when you pass it to FSEventStreamCreate
.
来源:https://stackoverflow.com/questions/7377392/declaring-callback-function-inside-fseventstreamcreate