如何将const void *转换为unsigned int?

时间:2018-11-23 01:49:08

标签: c++ lua

所以在这段代码中:

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”类型的实体

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

lua_topointer返回一个void const*。您的reinterpret_cast实际上没有任何更改。您需要写的是:

unsigned int value = reinterpret_cast<unsigned int>(lua_topointer(L, -1)));

但是请记住,这仅在int的大小恰好与指针的大小匹配的平台上有效。最好使用std::uintptr_t中的<cstdint>,因为可以保证大小匹配。

std::uintptr_t value = reinterpret_cast<std::uintptr_t>(lua_topointer(L, -1)));

答案 1 :(得分:2)

不清楚将void指针转换为整数是什么意思。如果要访问指向的对象,请参阅lua_topointer的文档:

  

将给定可接受索引处的值转换为通用C指针(void *)。该值可以是用户数据,表,线程或函数;否则,lua_topointer返回NULL。不同的对象将给出不同的指针。 无法将指针转换回其原始值。

     

通常,此功能仅用于调试信息。

还要注意,根据引用的文档,指向的对象不能是unsigned int


如果您打算将指针表示为整数,则首先我建议您考虑为什么。通常不需要。用整数表示可以完成的最合理的事情,例如打印,可以直接用指针本身完成。

但是如果您真的想将指针“转换”为整数,unsigned int并不是一个好的选择,因为它不能保证能够表示所有可以作为整数的值。 std::uintptr_t可以代表所有此类值,这将是正确的转换方式:

reinterpret_cast<std::uintptr_t>(data_pointer)