[英]Simplify dereferencing void pointer
此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;
这是优雅还是类型系统中的漏洞是个人喜好的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.