void*
C++98/03 では、a を関数ポインタに直接変換することはできません (キャストを使用してコンパイルしないでください)。これは、C++0x で条件付きでサポートされています (実装は動作を定義することを選択でき、それを定義する場合は、標準が行うべきであると述べていることを実行する必要がありますvoid*
。C++98/03 標準で定義されているA )。 、オブジェクトを指すことを意図しており、関数ポインターまたはメンバーポインターを含めることは意図されていませんでした。
あなたがしていることは実装に大きく依存していることを知っているlong long
ので、標準に従って明らかに未定義の動作であっても、ほとんどのプラットフォームでコンパイルして動作するはずのオプションを 1 つ示します (32 ビット ポインターを想定し、64 ビットで使用します)。
void *gptr = dlsym(some symbol..) ;
typedef void (*fptr)();
fptr my_fptr = reinterpret_cast<fptr>(reinterpret_cast<long>(gptr)) ;
そして、コンパイルして動作するはずの別のオプションがありますが、上記と同じ注意事項があります。
fptr my_ptr = 0;
reinterpret_cast<void*&>(my_ptr) = gptr;
それともスローモーションで...
// get the address which is an object pointer
void (**object_ptr)() = &my_ptr;
// convert it to void** which is also an object pointer
void ** ppv = reinterpret_cast<void**>(object_ptr);
// assign the address in the memory cell named by 'gptr'
// to the memory cell that is named by 'my_ptr' which is
// the same memory cell that is pointed to
// by the memory cell that is named by 'ppv'
*ppv = gptr;
これは基本的に、関数ポインタのアドレスがオブジェクト ポインタ ( void (**object_ptr)()
)であるという事実を利用reinterpret_cast
しているため、 などの他のオブジェクト ポインタに変換するために使用できますvoid**
。その後、( を逆参照することによって) アドレスをvoid**
実際の関数ポインターまでたどり、そこに gptr の値を格納することができます。
yuk - 決して明確に定義されたコードではありませんが、ほとんどの実装で期待どおりに動作するはずです。