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 0x 中,有条件地支持将 void* 转换为函数指针的行为。
以上是如何安全地将 `void*` 转换为 C 中的函数指针?的详细内容。更多信息请关注PHP中文网其他相关文章!