在Xt中定义回调proc时(例如XtTimerCallbackProc),client_data被指定为XtPointer。通过client_data而不是实际的指针传递一个int是安全的,然后将它转回到过程中吗?
例如:
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;
...
}
答案 0 :(得分:2)
是; API使用指针,因为这种类型的大小是> =几乎所有计算机/编译器组合上的int的大小,因此您只需通过强制转换就可以使用它来传递除double
之外的大多数内容。
答案 1 :(得分:1)
它应该是安全的,但您应该使用与指针大小相同的整数类型。
标准C99类型uintptr_t可用于此目的。
根据评论指出,使用此类型无法保证int-> ptr-> int。它应该比平常工作更多,但它不符合规范。
另一种方法是传递指针。如果您的应用是单线程的,您可能只是
static int data;并传递和数据。如果您的应用需要可重入,则malloc为int。
事实上,我不认为标准支持int-> ptr-> int以任何方式。