首页 > 后端开发 > C++ > 如何在 C 中 void* 和指向成员函数的指针之间进行转换?

如何在 C 中 void* 和指向成员函数的指针之间进行转换?

Mary-Kate Olsen
发布: 2024-10-29 07:18:02
原创
1068 人浏览过

How to Cast Between void* and a Pointer to Member Function in C  ?

void* 和指向成员函数的指针之间的转换困难

使用 C 库时,开发人员经常会在 void* 和指向成员函数的指针之间进行转换时遇到挑战。本文旨在解决与该主题相关的具体问题并提供可行的解决方案。

问题陈述

为了方便将 C 对象绑定到 Lua 解释器(一个函数), call_int_function 是使用 GCC 4.4 设计的。然而,reinterpret_cast)(int, int)>(lua_touserdata(L, lua_upvalueindex(1))) 行引发了编译错误,指示从 void 到指针的无效转换到成员函数。

错误原因

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板