繁体   English   中英

简化取消引用空指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM