Quiero reinterpretar el lanzamiento de un puntero a una variable void *. El tipo del puntero a la función será del tipo Class* (*)(void*)
.reinterpret_cast a void * no funciona con los punteros a la función
A continuación se muestra el código de ejemplo,
class Test
{
int a;
};
int main()
{
Test* *p(void **a);
void *f=reinterpret_cast<void*>(p);
}
El código anterior funciona bien con los compiladores de Visual Studio/x86. Pero con el compilador ARM, da error de compilación. No sé por qué.
Error: #694: reinterpret_cast cannot cast away const or other type qualifiers
leí la explicación en Casting a function pointer to another type
que estaba preocupado por la explicación a continuación.
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.
cómo hacer este tipo de conversiones de void (*)(void*) -> void*
efectiva, para que al menos se compila casi el mismo en la mayoría de los compiladores?
Debería al menos poner en una afirmación que 'sizeof (void *)> = sizeof (Test ** (*) (void **))'. Si esta afirmación falla, entonces obviamente no hay forma de almacenar el puntero de función en un 'void *'. Si la afirmación no falla, aún no garantiza nada, pero al menos es posible que el elenco funcione. –
Tenga en cuenta que p en realidad tiene el tipo Test ** (void **), y es una función, no un puntero de función. Poner un espacio en "' Test * * '" no afecta el análisis. – MSalters