He visto una función cuyo prototipo es:
int myfunc(void** ppt)
Esta función se llama en un archivo C como a = myfunc(mystruct **var1);
donde mystruct es typedef para una de las estructuras que tenemos.
Esto funciona sin ningún error de compilación en MSVC6.0, pero cuando lo compilo con algún otro compilador de C, da un error en el lugar donde se llama a esta función con un mensaje de error:
El argumento de tipo mystruct ** es incompatible con el parámetro de tipo void **
El argumento de myfunc() se mantiene como void** porque parece ser un tipo de función malloc genérica que se llama con varios tipos de variables de estructura para la asignación de memoria.
mystruct**
, pero no funcionó]-ANUNCIO
Solución del problema
Las preguntas frecuentes de comp.lang.c abordan este problema en detalle en la Pregunta 4.9. En resumen, dicen que no es estrictamente portátil convertir un puntero a puntero arbitrario en un void **
; continúan explicando que "un código como este puede funcionar y, a veces, se recomienda, pero se basa en que todos los tipos de punteros tengan la misma representación interna (que es común, pero no universal)". Continúan explicando que "cualquier void **
valor con el que juegues debe ser la dirección de un void *
valor real en alguna parte; las conversiones como (void **)&dp
, aunque pueden cerrar el compilador, no son portátiles (y es posible que ni siquiera hagan lo que quieres)".
Por lo tanto, puede lograr de manera segura/portátil el comportamiento deseado con código como:
some_type *var1 = foo();
void *tmp_void_ptr = (void *)var1;
myfunc(&tmp_void_ptr);
No hay comentarios.:
Publicar un comentario