首页 > 后端开发 > C++ > 正文

如何安全地将 `void*` 转换为 C 中的函数指针?

DDD
发布: 2024-11-03 01:36:02
原创
468 人浏览过

How Can I Safely Cast a `void*` to a Function Pointer in C  ?

C 中的函数指针转换

在 C 中,通常不允许将 void* 直接转换为函数指针。但是,有一些方法可能会起作用,具体取决于实现和平台。

方法 1(未定义行为):

此方法涉及双重reinterpret_casting:

<code class="cpp">void *gptr = dlsym(some symbol..);
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
登录后复制

方法 2(避免直接转换):

此方法使用中间步骤将函数指针地址存储在变量中:

<code class="cpp">fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;</code>
登录后复制

方法 2 的较慢但更透明的版本:

<code class="cpp">void (**object_ptr)() = &my_ptr;

void ** ppv = reinterpret_cast<void**>(object_ptr);

*ppv = gptr;</code>
登录后复制

限制和注意事项:

  • 这些方法是实现 -依赖,并且它们的行为不受 C 标准保证。
  • 它们可能会在某些平台或某些编译器上导致未定义的行为。
  • 建议在使用指针之前始终检查指针的有效性作为函数指针。

注意:

在 C 0x 中,有条件地支持将 void* 转换为函数指针的行为。

以上是如何安全地将 `void*` 转换为 C 中的函数指针?的详细内容。更多信息请关注PHP中文网其他相关文章!

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