将long int *转换为long long int *

时间:2015-09-02 10:27:03

标签: c++ c++11

在我的平台上,long int和long long int都是相同的(64位)。我有一个指向long int的指针,我想将它转换为指向long long int的指针。以下代码

static_cast<long long int*>(pointer);

是不允许的。在C ++ 11中这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:6)

你必须强制重新解释&#39;指针:

reinterpret_cast<long long int*>(pointer);

这种转换意味着编译器&#34;停止检查,我知道如何更好地解释该表达式中的二进制数据&#34;。因此,每当制作reinterpret_cast时 - 检查两次平台,内存对齐等知识。编写一些简单的单元测试等,通过valgrind或地址消毒剂运行它们。

所以现在想想,如果你真的需要施放这样的指针。通常重新设计功能等可以解决此类问题(例如,如果您只需要来自指定值的数据 - 将其存储在一些额外的变量等中。)。

您也可以尝试通过编译器强制检查一下:

template <typename Dest, typename Src>
Dest* safe_pointer_cast(Src* src)
{
  static_assert(sizeof(Src) == sizeof(Dest), "size of pointed values differ");
  static_assert(alignof(Src) == alignof(Dest), "alignment different");
  return reinterpret_cast<Dest*>(src);
}

答案 1 :(得分:1)

您可以通过额外存储以便携方式执行此操作:

long* ptr = /***/;
long long extra_storage = *ptr;
long long* long_ptr = &extra_storage;

没有额外的存储空间,但有编译时检查:

static_assert(sizeof(long) == sizeof(long long));
long* ptr = /***/;
long long* long_ptr = reinterpret_cast<long long*>(ptr);