2012-04-29 24 views
8

En C++ puede tener contenedores genéricos y de tipo seguro utilizando plantillas. Sin embargo, en C, si desea contenedores genéricos, debe (afaik) utilizar void*, lo que significa que pierde seguridad del tipo. Para tener contenedores seguros, tendrías que volver a implementarlos para cada tipo de datos que quieras guardar.En C, Envases genéricos o Envases seguros?

Dado que C sigue una más el programador-sabe-qué-hes-hacer filosofía que C++, lo que sería la cosa más idiomática que hacer en C: utilizar contenedores genéricos con void*, o hacer los envases personalizados para cada tipo de datos?

Respuesta

3

Me apunto para contenedores genéricos:

  1. Una vez que se acostumbre a ella, que acaba de pensar de void * es el significado del tipo de algo cuando no se preocupan por su tipo. Es como Object en Java, donde, durante mucho tiempo, los contenedores genéricos tampoco tenían seguridad de tipo.

  2. Solo tiene un lugar para realizar mejoras.

  3. No obtiene el tipo de seguridad; pero con implementaciones repetidas de contenedores seguros tipo, se corre el riesgo de copiar y pegar errores. Eso puede conducir a errores, también.

0

Para crear un tipo que maneje datos genéricos en C, debe usar void* para pasar los datos. No es práctico definir nuevos algoritmos para cada tipo posible.

+0

Bueno, solo definiría los algoritmos que necesita. Pero veo lo que estás diciendo. –

+0

@PaulManta: Sí, me estaba saliendo del ejemplo contenedor que debería manejar tipos arbitrarios. –

0

no tiene ningún beneficio real al usar void* como miembro (a menos, por ejemplo, los tiempos de compilación son más importantes), siempre puede convertir a void* según corresponda, luego operar en blobs de datos sin tipo cuando sea necesario.

he implementado tales interfaces en C (por ejemplo, variantes múltiples con campos con nombre de diferentes tipos). Yo prefería tener el tipo de seguridad, y rara vez encontré el casting a void* algo bueno en estas implementaciones.

... entonces otra vez, paso más tiempo escribiendo C++ que c :)

0

así que tuve una búsqueda rápida para ver si los nuevos ideas inteligentes habían surgido en el campo de los envases C.

Encontré this. Es un intento bastante completo de una biblioteca completa de contenedores C.

Pasa alrededor de los elementos que se incluirán en void * punteros. No hay ningún intento de especificar estructuras de un tipo particular.

Para la seguridad del tipo, se PODRÍA escribir una macro "envoltura" para cada contenedor, que define un host si las funciones en línea envuelven una versión sin tipo y proporcionan el tipo de seguridad. Con suerte, el compilador los optimizaría, pero esto no siempre es posible. Y las macros serían feo.

Supongo que esta es una de las razones por las que más programas (de aplicación) se escriben en C++ en lugar de C. La capacidad de crear abstracciones complejas en C es limitada. Puede hacerlo, pero generalmente sacrifica otros aspectos como el rendimiento o la capacidad de mantenimiento (consulte un programa C GTK, por ejemplo).

+0

Con la nueva palabra clave '_Generic' de C11, esas macros no deberían ser demasiado feas, en realidad. Clang ya implementa esto, y gcc también tiene suficientes características para emularlo. –