这个 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;
这是优雅的还是类型系统中的一个大洞是个人喜好的问题。