2009-12-11 3 views
1

Xt에서 콜백 proc (예 : XtTimerCallbackProc)을 정의 할 때 client_data는 XtPointer로 지정됩니다. 실제 포인터가 아닌 client_data를 통해 int를 전달하고 프로 시저 내부로 다시 캐스팅하는 것이 안전합니까? 예를 들어XtPointer를 사용하여 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; 
    ... 
} 

답변

1

안전해야하지만 포인터와 크기가 같은 정수 유형을 사용해야합니다.

표준 C99 유형 uintptr_t를이 용도로 사용할 수 있습니다.

주석에 따라 int-> ptr-> int는이 유형의 사용으로 보장되지 않습니다. 그것은 더 자주 작동해야하지만, 그것은 사양대로되지 않습니다.

다른 대안은 포인터를 전달하는 것입니다. 앱이 단일 스레드 인 경우

static int data; & 데이터를 전달합니다. 귀하의 애플 리케이션이 재진입 성이 필요하다면, malloc int.

사실, 나는 표준이 어떤 식 으로든 int-> ptr-> int를 지원한다고 생각하지 않는다.

+0

'#include '에 있습니다. OP가 그것에 대해 알지 못하는 경우를 대비하여. – ephemient

+0

내가 읽은 것부터 uintptr_t는 ptr-> int-> ptr에서 작동 할 것이지만, 반드시 int-> ptr-> int가 될 필요는 없습니다. 따라서 짧은 대답은 아니오, 휴대용 방법은 없습니다. 그 맞습니까? – ToddR

2

예; API는이 유형의 크기가 거의 모든 컴퓨터/컴파일러 조합의 int 크기보다 크기 때문에 포인터를 사용합니다. 따라서 이것을 사용하여 캐스팅만으로 double을 제외한 대부분의 항목을 전달할 수 있습니다.

+0

저는 GCC가 지원하는 모든 ABI에 대해'sizeof (long) == sizeof (void *) '라고 믿습니다. – ephemient

관련 문제