简化解除引用无效指针

时间:2013-09-25 16:30:50

标签: c++

这个WINAPI线程回调:

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

特别是这一行:

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

的工作原理。但*((int *)context)是各种令人讨厌的。有没有更好的方法来写这个?

4 个答案:

答案 0 :(得分:4)

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

如果需要,你无法真正解决这个事实。

答案 1 :(得分:3)

您可以使用reinterpret_cast

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

答案 2 :(得分: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));
}

答案 3 :(得分:1)

虽然问题标记为C ++,但它也完全有效作为C问题(而且我从来不知道人们是否准确标记问题),所以...

在C中,经常写着:

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

这种优雅还是类型系统中的漏洞是个人偏好的问题。