When defining a callback proc in Xt (for example XtTimerCallbackProc
), client_data
is specified as an XtPointer
. Is it safe to pass an int
via client_data
, rather than an actual pointer, and cast it back inside the procedure?
For example:
void foo(void) {
...
int data = 1;
XtAppAddTimeout(app_context, 1000, timer_cb, data);
...
}
void timer_cb(XtPointer client_data, XtIntervalId *timer)
{
int my_data = (int) client_data;
...
}
It should be safe, but you should use an integer type that have the same size as a pointer.
The standard C99 type uintptr_t can be used for this purpose.
As per comments point out, int->ptr->int is not guaranteed by the use of this type. It should work more than often, but it is not as per specifications.
The alternative is to pass a pointer. If your app is single threaded, you might just do
static int data; and passs &data. If your app needs to be reentrant, then malloc an int.
As a matter of fact, I don't think the standard support int->ptr->int in any way.