En C, no es un error lanzar punteros hacia y desde void *
.Relajar void * casting en C++
Un obstáculo importante en la migración a C++ es la necesidad de lanzar punteros cuando regrese de funciones relacionadas con punteros genéricos como malloc
y funciones declaradas en mi propio código como void *block_get(Blkno const blkno);
.
Sin embargo, mi código está destinado a ser compilado por C y compiladores de C++ con éxito. Si proporciono moldes explícitos en todas partes por el bien de C++, deben ser moldes de estilo C y es posible que esté enmascarando errores debido a la fundición de tipos de puntero ay desde los tipos de puntero de ambos idiomas.
Mi error de referencia es la siguiente:
struct Cpfs *cpfs = calloc(1, sizeof(*cpfs));
que a MSVC produce:
error C2440 error de 2: 'inicialización': no se puede convertir de 'void *' a 'CPFS *' e: \ src \ CPF \ cpfs.c 179
Evidentemente no puedo usar new
o static_cast
la que me gustaría usar, naturalmente, si ya no estaba usando C. ¿Cuál es la mejor manera de proporcionar seguridad máxima de tipo que rodea void *
para cada idioma con una mínima verborrea?
¿Por qué necesita hacer un puerto al subconjunto común de C y C++? Como has descubierto, limita severamente qué C (o qué C++) puedes usar. Casi todos los entornos que tienen C++ disponible también tienen C disponible y también le permiten vincular archivos de objetos C++ y C juntos. No puedo ver qué ganancia obtienes transfiriendo al subconjunto común. –
Para * tipo de seguridad en C * (que es un poco difícil), haga una función para cada estructura cuyo trabajo es asignar y devolver un puntero a una nueva estructura. Del mismo modo, realice una función para liberar la estructura. – rwong
Me gustaría saber la razón para intentar escribir un programa que compila para dos idiomas diferentes. Eso es típicamente algo dejado para acertijos. – GManNickG