Greetings,
> It works. Just ((MyStruct *) data)->x looks strange.
As Michael Knigge has suggested, you may just rename the parameter to
something else and then have something like
MyStruct* data = (MyStruct*)foo;
as the first line in your callback() function.
In fact I believe in C implicit casts from void* are allowed, so the
explicit cast on the right is probably unnecessary. However, C++
compilers definitely do not allow implicit casts from void*, so you
might as well put it, just in case.
> It means that while passing the 3rd argument in sqlite3_exec(), the
> argument has been casted to void* ?
The 3rd argument is "callback", it's expected to be of type
int (*callback)(void*, int, char**, char**)
your original callback however had a different type, namely
int (*callback)(MyStruct*, int, char**, char**)
I'm not exactly sure what the semantics for function pointer casts are,
if there are any at all. To (maybe) answer your question, casts from
pointer types to void* are always allowed, that is why your 4th argument
of type MyStruct* is accepted without any complaints, even though
sqlite3_exec() expects a void* there.
The warning had nothing to do with the 4th argument ("first argument to
callback") at all, only with the 3rd argument ("callback function").
The program happens to run correctly because the internal
representation, etc. of the function happens to be the same with both
parameter types (MyStruct* and void*), but that is undefined behavior
and it might well crash on a different platform or with a different
compiler (although I'd guess in this particular case it's probably
rather unlikely).
Regards,
-- Markus Thiele
_______________________________________________
sqlite-users mailing list
[email protected]
http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users