Estructuras de datos genéricas y seguras en C mediante uniones

Fuentes: Type Safe Generic Data Structures in C Using Unions

El artículo técnico detalla una técnica para implementar estructuras de datos genéricas y seguras de tipos en el lenguaje C, utilizando uniones para asociar información de tipo con la estructura de datos. El autor, que no encuentra esta aproximación ampliamente documentada, la ilustra mediante la implementación de una lista enlazada básica. El método permite que la compilación falle si se intenta insertar un tipo de dato incompatible, garantizando la seguridad de tipos sin recurrir a punteros genéricos inseguros.

El texto compara tres enfoques principales. El primero utiliza macros para generar funciones específicas para cada tipo, lo cual es seguro pero ineficiente al requerir múltiples inclusiones de cabeceras. El segundo emplea punteros void *, que es flexible pero inseguro y propenso a errores de memoria, como la necesidad de dos asignaciones por nodo. El tercer enfoque, descrito como más eficiente, integra los datos directamente en el nodo mediante un arreglo flexible, eliminando la sobrecarga de memoria y las caché misses.

La solución central se basa en una unión que contiene un puntero a la cabecera de la lista y un puntero a la carga de datos (payload). Al usar el operador ternario dentro de una macro, se fuerza la coincidencia de tipos entre el elemento a insertar y la estructura de la lista. Si los tipos no coinciden, el compilador genera un error de incompatibilidad de punteros. Esta técnica también permite obtener el tipo correcto mediante __typeof__() para funciones que devuelven punteros a los datos contenidos, mejorando la portabilidad entre compiladores modernos como Clang, GCC y MSVC.