Cómo lograr estructuras de datos genéricas y type safe en C
Type Safe Generic Data Structures in C

El autor presenta una técnica poco común para escribir estructuras de datos genéricas en C que el compilador verifica en tiempo de compilación. Usando uniones con un miembro payload parametrizado y el operador ternario, logra que añadir el tipo equivocado a una lista genere un error. El método funciona para mapas, arrays y árboles binarios, y evita los problemas de las macros reutilizadas o de void *.
Macros get a bad rep, but I think this is fairly understandable.