関数ポインタをvoid*変数にキャストすることを再解釈したいと思います。関数ポインタのタイプはタイプになりますClass* (*)(void*)
。
以下はサンプルコードです。
class Test
{
int a;
};
int main()
{
Test* *p(void **a);
void *f=reinterpret_cast<void*>(p);
}
上記のコードは、Visual Studio/x86コンパイラでうまく機能します。しかし、ARMコンパイラでは、コンパイルエラーが発生します。理由はわかりません。
エラー:#694:reinterpret_castはconstまたは他の型修飾子をキャストできません
関数ポインタを別の型にキャストするの説明を読みました
以下の説明が気になりました。
関数ポインタと通常のポインタの間のキャスト(たとえば、a
void (*)(void)
をaにキャストするvoid*
)。一部のアーキテクチャでは、追加のコンテキスト情報が含まれている可能性があるため、関数ポインタは必ずしも通常のポインタと同じサイズである必要はありません。これはおそらくx86で問題なく動作しますが、未定義の動作であることを忘れないでください。
void (*)(void*) -> void*
少なくともほとんどのコンパイラでほぼ同じようにコンパイルされるように、このような変換を効果的に行うにはどうすればよいですか?