所以在这段代码中:
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”类型的实体
任何帮助将不胜感激。
答案 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)