将long int*转换为long long int*

Convert long int* to long long int*

本文关键字:long int 转换      更新时间:2023-10-16

在我的平台上,long int和long long int都是相同的(64位)。我有一个指向长整型的指针我想把它转换成指向长整型的指针。下面的代码

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);
}

你可以用一种便携的方式使用额外的存储空间:

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);