使用 C 库时,开发人员经常会在 void* 和指向成员函数的指针之间进行转换时遇到挑战。本文旨在解决与该主题相关的具体问题并提供可行的解决方案。
为了方便将 C 对象绑定到 Lua 解释器(一个函数), call_int_function 是使用 GCC 4.4 设计的。然而,reinterpret_cast
GCC 认为从 void 到 void (T::)(int, int) 的转换无效,因为指向成员的指针与常规指针不同。它们不是传统意义上的地址,并且它们的实现在不同编译器之间存在很大差异。
此问题的解决方案在于将成员函数包装在常规函数中。 free 函数应将对象作为其第一个参数。这种方法消除了转换为 void* 的需要,并允许使用指向函数类型的常规指针。
这是使用建议的解决方案重写的 call_int_function 版本:
<code class="cpp">template <class T> int call_int_function(lua_State *L) { void (*method)(T*, int, int) = reinterpret_cast<void (*)(T*, int, int)>(lua_touserdata(L, lua_upvalueindex(1))); T *obj = reinterpret_cast<T *>(lua_touserdata(L, 1)); method(obj, lua_tointeger(L, 2), lua_tointeger(L, 3)); return 0; }</code>
通过将成员函数包装在常规函数中,消除了强制转换为 void* 的需要,解决了 GCC 4.4 中遇到的编译错误。这种方法保留了预期的功能,同时遵守指针到成员转换的限制和要求。
以上是如何在 C 中 void* 和指向成员函数的指针之间进行转换?的详细内容。更多信息请关注PHP中文网其他相关文章!