c – 将long int *转换为long long int *

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

static_cast<long long int*>(pointer);

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

最佳答案
你必须强制指针的’重新解释’:

reinterpret_cast<long long int*>(pointer);

这种转换意味着编译器“停止检查,我知道如何更好地解释该表达式中的二进制数据”.因此,每当进行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);
}

转载注明原文:c – 将long int *转换为long long int * - 代码日志