2009-12-11 3 views
1

При определении процесса обратного вызова в Xt (например, XtTimerCallbackProc) client_data указывается как XtPointer. Безопасно ли передавать int через client_data, а не фактический указатель, и отбрасывать его внутри процедуры?Безопасно ли передавать int с помощью XtPointer?

Например:

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; 
    ... 
} 

ответ

1

Это должно быть безопасно, но вы должны использовать целочисленный тип, который имеет тот же размер, что и указатель.

Для этой цели можно использовать стандартный тип u9900 uintptr_t.

В соответствии с комментариями пункт, int-> ptr-> int не гарантируется при использовании этого типа. Он должен работать больше, чем часто, но он не соответствует спецификациям.

Альтернативный вариант - передать указатель. Если ваше приложение однопоточное, вы можете просто сделать

статические данные int; и передает данные &. Если ваше приложение должно быть реентерабельным, тогда malloc int.

На самом деле, я не думаю, что стандартная поддержка int-> ptr-> int каким-либо образом.

+0

Найдено в '#include ', в случае, если OP об этом не знает. – ephemient

+0

Из того, что я прочитал, uintptr_t гарантированно работает для ptr-> int-> ptr, но не обязательно int-> ptr-> int. Таким образом, короткий ответ кажется нет, нет портативного способа. Это верно? – ToddR

2

Да; API использует указатель, потому что размер этого типа составляет> = размер int почти для любой комбинации компьютеров и компиляторов, поэтому вы можете использовать его для передачи большинства вещей, кроме double, просто путем литья.

+0

Я считаю, что 'sizeof (long) == sizeof (void *)' для каждого ABI, поддерживаемого GCC. – ephemient

Смежные вопросы