typecasting function pointer to void*

W

WittyGuy

How to typecast a "function pointer" to "const void*" type in C++ way?

int MyFunction (double money); // Function prototype

const void* arg = (const void*)MyFunction; // type casting function
pointer to const void* in C-style

void(*pFunc)() = (void(*)())(arg); // type casting const void* to function
pointer in C-style
(*pFunc)(); // Calling the function after type casting is done

Is typecasting like above is safe anyway?

regards,
Sukumar
 
F

Florian Stinglmayr

WittyGuy said:
How to typecast a "function pointer" to "const void*" type in C++ way?

int MyFunction (double money); // Function prototype

I suggest you to create a typedef for the function pointer:
typedef int (*TMyFunction) ( double );

And then use it!
void * ptr = static_cast<void*>(&some_func);
....
(static_cast<TMyFunction>(ptr))(23.42):
 
K

Kai-Uwe Bux

WittyGuy said:
How to typecast a "function pointer" to "const void*" type in C++ way?

There is no "how".
int MyFunction (double money); // Function prototype

const void* arg = (const void*)MyFunction; // type casting function
pointer to const void* in C-style

void(*pFunc)() = (void(*)())(arg); // type casting const void* to function
pointer in C-style
(*pFunc)(); // Calling the function after type casting is done

You are casting back to a different signature. Even if there was a roundtrip
guarantee through void* (which there is not), this conversion would be
unspecified.
Is typecasting like above is safe anyway?

No: In C++ there is no round-trip guarantee for pointer-to-function or
pointer-to-member-function to void* and back. Just don't do it.

Function pointers are convertible to a different signature, however, the
result of such conversion cannot be used: it can only be converted back.
However, this does allow you to use void(*)(void) as a universal function
pointer to and from which you can cast (reinterpret_cast is the one you
might want to use) [5.2.10/6].


Best

Kai-Uwe Bux
 
R

Rolf Magnus

WittyGuy said:
How to typecast a "function pointer" to "const void*" type in C++ way?

Not possible in standard C++. You can only cast object pointers to void*,
not function pointers.
int MyFunction (double money); // Function prototype

const void* arg = (const void*)MyFunction; // type casting function
pointer to const void* in C-style

void(*pFunc)() = (void(*)())(arg); // type casting const void* to function
pointer in C-style
(*pFunc)(); // Calling the function after type casting is done

Is typecasting like above is safe anyway?

It is not safe at all. Assuming that your compiler supports the conversion
function pointer -> void pointer as an extension (which is not too
uncommon), it would still be very dangerous, because you're calling a
function that takes one argument through a pointer to function that takes
no arguments.
 
M

msosno01

I think you can use reinterpret cast.
Rolf said:
Not possible in standard C++. You can only cast object pointers to void*,
not function pointers.


It is not safe at all. Assuming that your compiler supports the conversion
function pointer -> void pointer as an extension (which is not too
uncommon), it would still be very dangerous, because you're calling a
function that takes one argument through a pointer to function that takes
no arguments.
 
D

Default User

I think you can use reinterpret cast.

Don't top-post.


You can get the compiler to shut up about the illegal conversion, but
that doesn't mean it will work.




Brian
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top