2009-12-11 86 views
1

在Xt中定義回調函數時(例如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 2009-12-11 18:28:10

+0

從我讀過的,uintptr_t保證爲ptr-> int-> ptr工作,但不一定int-> ptr-> int。所以簡短的答案似乎是沒有,沒有便攜的方式。那是對的嗎? – ToddR 2009-12-12 16:15:51

2

是; API使用了一個指針,因爲這種類型的大小几乎在任何計算機/編譯器組合中都大於int的大小,所以你可以使用它來簡單地通過強制轉換來傳遞除double以外的大部分內容。

+0

我相信,對於GCC支持的每個ABI,sizeof(long)== sizeof(void *)'。 – ephemient 2009-12-11 18:32:32

相關問題