Chcę ponownie interpretować rzut wskaźnika funkcji na zmienną void *. Typ wskaźnika funkcji będzie typu Class* (*)(void*)
.reinterpret_cast do void * nie działa z wskaźnikami funkcji
Poniżej znajduje się przykładowy kod,
class Test
{
int a;
};
int main()
{
Test* *p(void **a);
void *f=reinterpret_cast<void*>(p);
}
Powyższy kod działa dobrze z Visual Studio kompilatory/x86. Ale z kompilatorem ARM daje błąd kompilacji. Nie wiem dlaczego.
Error: #694: reinterpret_cast cannot cast away const or other type qualifiers
czytam wyjaśnienia w Casting a function pointer to another type
byłem zaniepokojony poniżej wyjaśnienia.
Casting between function pointers and regular pointers (e.g. casting a
void (*)(void)
to avoid*
). Function pointers aren't necessarily the same size as regular pointers, since on some architectures they might contain extra contextual information. This will probably work ok on x86, but remember that it's undefined behavior.
Jak zrobić takie konwersje z void (*)(void*) -> void*
tak skutecznie, że conajmniej kompiluje prawie takie same w większości kompilatorów?
Powinieneś przynajmniej umieścić w twierdzeniu, że 'sizeof (void *)> = sizeof (Test ** (*) (void **))'. Jeśli to potwierdzenie nie powiedzie się, to oczywiście nie ma sposobu na zapisanie wskaźnika funkcji w 'void *'. Jeśli asercja nie zawodzi, nadal nie gwarantuje niczego, ale przynajmniej możliwe, że obsada może działać. –
Należy zauważyć, że p rzeczywiście ma typ Test ** (void **) i jest funkcją, a nie wskaźnikiem funkcji. Umieszczenie spacji w "' Test * * '" nie wpływa na parsowanie. – MSalters