0

この WINAPI スレッド コールバック:

DWORD WINAPI dont_thread_on_me(LPVOID context) {
    int value = *((int *)context);
    return ERROR_SUCCESS;
}

特に次の行:

    int value = *((int *)context);

動作します。しかし*((int *)context)、あらゆる種類の厄介です。それを書くためのより良い方法はありますか?

4

4 に答える 4

4
int value = *reinterpret_cast<int *>(context);

キャストが必要な場合、キャストがあるという事実を実際に回避することはできません。

于 2013-09-25T16:32:58.123 に答える
3

あなたが使用することができますreinterpret_cast:

int value = *reinterpret_cast<int *>(context);
于 2013-09-25T16:32:57.317 に答える
2

コンパイラは、context. したがって、キャストを使用してコンパイラに、それが指すことを伝える必要がありますint。のようなマクロでこれを隠すことができます

#define read_as_int(p) *(reinterpret_cast<int*>(p))

int value = read_as_int(context);

しかし、これは読みやすさもコードを入力する労力も改善しません。C++ の純粋主義者は、インライン関数を好むかもしれません。

int inline read_as_function(void*p) 
{ 
    return *(reinterpret_cast<int*>(p));
}
于 2013-09-25T16:35:57.337 に答える
1

質問には C++ のタグが付けられていますが、C の質問としても完全に有効です (人々が質問に正確にタグを付けているかどうかはわかりません)。

C では、次のように記述されることがよくあります。

foo( void *v ) {
  int *ip = v;
  int x = *ip;

これがエレガントなのか、それとも型システムにぽっかり穴が開いているのかは、個人的な好みの問題です。

于 2013-09-25T16:37:48.127 に答える