1

Xtでコールバックプロシージャ(たとえば、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;
   ...
}
4

2 に答える 2

2

はい; doubleこのタイプのサイズはほとんどすべてのコンピューター/コンパイラーの組み合わせでintのサイズであるため、APIはポインターを使用します。したがって、キャストする以外のほとんどのものを渡すために使用できます。

于 2009-12-11T14:34:21.933 に答える
1

安全なはずですが、ポインタと同じサイズの整数型を使用する必要があります。

この目的には、標準のC99タイプuintptr_tを使用できます。

コメントが指摘しているように、int->ptr->intはこのタイプの使用によって保証されません。頻繁に動作するはずですが、仕様どおりではありません。

別の方法は、ポインターを渡すことです。アプリがシングルスレッドの場合は、

static int data; &dataを渡します。アプリを再入可能にする必要がある場合は、mallocint。

実際のところ、標準のサポートはint->ptr->intではないと思います。

于 2009-12-11T14:35:36.107 に答える