Can C Convert a Void Pointer to a Function Pointer?
Nov 03, 2024 am 04:42 AMConverting Void Pointers to Function Pointers: A Conditional Possibility in C
Problem
Obtaining a void pointer via dlsym(), the goal is to invoke the function referenced by that pointer. The attempted conversion through casting using static_cast or reinterpret_cast has failed, unlike a C-style cast.
Answer
Direct conversion of a void pointer to a function pointer is impermissible in C 98/03. However, C 0x offers conditional support, allowing an implementation to dictate the behavior.
Undefined Behavior Approach:
While undefined by the standard, the following code may work on most platforms:
<code class="cpp">void *gptr = dlsym(some symbol..); typedef void (*fptr)(); fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr));</code>
Alternatively:
<code class="cpp">fptr my_ptr = 0; reinterpret_cast<void*&>(my_ptr) = gptr;</code>
Complex but Portable Approach:
This method exploits the fact that a function pointer's address is an object pointer:
<code class="cpp">// Get address as object pointer void (**object_ptr)() = &my_ptr; // Convert to void** (also an object pointer) void **ppv = reinterpret_cast<void**>(object_ptr); // Store address from 'gptr' in memory cell pointed to by 'ppv' *ppv = gptr;</code>
This approach remains undefined in the standard but should function reasonably well on most implementations.
The above is the detailed content of Can C Convert a Void Pointer to a Function Pointer?. For more information, please follow other related articles on the PHP Chinese website!

Hot Article

Hot tools Tags

Hot Article

Hot Article Tags

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

What are the types of values returned by c language functions? What determines the return value?

What are the definitions and calling rules of c language functions and what are the

C language function format letter case conversion steps

Where is the return value of the c language function stored in memory?

How do I use algorithms from the STL (sort, find, transform, etc.) efficiently?

How does the C Standard Template Library (STL) work?
