如何将 const void* 转换为 unsigned int?
Posted
技术标签:
【中文标题】如何将 const void* 转换为 unsigned int?【英文标题】:How to convert const void* to unsigned int? 【发布时间】:2018-11-23 01:49:08 【问题描述】:所以在这段代码中:
unsigned int lptr = lua_topointer(L, -1);
它给出了错误: 无法从 'const void *' 转换为 'unsigned int'
我尝试过 reinterpret_cast 将其转换为:
unsigned int lptr = reinterpret_cast<const void*>(lua_topointer(L, -1)));
但它给了我另一个错误: “const void*”类型的值不能用于初始化“unsigned int”类型的实体
任何帮助将不胜感激。
【问题讨论】:
你为什么要这样做?您是否尝试获取地址的整数值以便打印? 【参考方案1】:lua_topointer
返回一个void const*
。您的 reinterpret_cast
实际上并没有改变任何东西。你需要写的是:
unsigned int value = reinterpret_cast<unsigned int>(lua_topointer(L, -1)));
但请记住,这仅适用于int
大小恰好与指针大小匹配的平台。最好使用<cstdint>
中的std::uintptr_t
,因为可以保证大小匹配。
std::uintptr_t value = reinterpret_cast<std::uintptr_t>(lua_topointer(L, -1)));
【讨论】:
【参考方案2】:不清楚将 void 指针转换为整数是什么意思。如果你打算访问指向的对象,那么请看lua_topointer
的文档:
将给定可接受索引处的值转换为通用 C 指针 (void*)。该值可以是用户数据、表、线程或函数;否则,lua_topointer 返回 NULL。不同的对象会给出不同的指针。 无法将指针转换回其原始值。
通常此函数仅用于调试信息。
另请注意,根据引用的文档,指向的对象不能是unsigned int
。
如果您打算将指针表示为整数,首先我建议您考虑为什么要这样做。通常不需要它。大多数可以用整数表示来完成的合理的事情,比如打印,都可以直接用指针本身来完成。
但是如果你真的想要将指针“转换”为整数,unsigned int
不是一个好的选择,因为它不能保证能够表示可以表示的所有值一个数据指针。std::uintptr_t
可以表示所有这些值,这是正确的转换方式:
reinterpret_cast<std::uintptr_t>(data_pointer)
【讨论】:
reinterpret_cast
指向大小相等或更大的整数类型的指针也是正确的 (en.cppreference.com/w/cpp/language/reinterpret_cast)
@PeterRuderman 好点。我不建议使用 memcpy。以上是关于如何将 const void* 转换为 unsigned int?的主要内容,如果未能解决你的问题,请参考以下文章
void Test::printxy(void)' : 不能在 const 类中将 'this' 指针从 'const Test' 转换为 'Test &'
qsort 给出 [错误]:从 `int (*)(cricketer*, cricketer*)' 到 `int (*)(const void*, const void*)' 的无效转换