この WINAPI スレッド コールバック:
DWORD WINAPI dont_thread_on_me(LPVOID context) {
int value = *((int *)context);
return ERROR_SUCCESS;
}
特に次の行:
int value = *((int *)context);
動作します。しかし*((int *)context)
、あらゆる種類の厄介です。それを書くためのより良い方法はありますか?
この WINAPI スレッド コールバック:
DWORD WINAPI dont_thread_on_me(LPVOID context) {
int value = *((int *)context);
return ERROR_SUCCESS;
}
特に次の行:
int value = *((int *)context);
動作します。しかし*((int *)context)
、あらゆる種類の厄介です。それを書くためのより良い方法はありますか?
int value = *reinterpret_cast<int *>(context);
キャストが必要な場合、キャストがあるという事実を実際に回避することはできません。
あなたが使用することができますreinterpret_cast
:
int value = *reinterpret_cast<int *>(context);
コンパイラは、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));
}
質問には C++ のタグが付けられていますが、C の質問としても完全に有効です (人々が質問に正確にタグを付けているかどうかはわかりません)。
C では、次のように記述されることがよくあります。
foo( void *v ) {
int *ip = v;
int x = *ip;
これがエレガントなのか、それとも型システムにぽっかり穴が開いているのかは、個人的な好みの問題です。