Produire des composants logiciels réutilisables est un objectif de l'ingénierie du logiciel. En particulier, on souhaite que les structures de données (que ce soit des tables, des piles, des arbres, etc) puissent être utilisées quel que soit le type des objets qui y sont rangés. C'est la notion de structures de données et de fonctions génériques .
C ne dispose pas d'une notion générale de généricité, à la différence de Lisp, ML, d'Ada ou de C++. Cependant, le type void* permet d'implémenter facilement des structures de données quand ces données sont des pointeurs vers des objets plutôt que les objets eux-mêmes. Le principe est que l'on peut affecter un pointeur void* vers un pointeur d'un type quelconque et inversement, de façon sûre, et sans qu'il soit nécessaire d'effectuer une coercition.
Reprenons l'exemple du parcours en profondeur d'un arbre à l'aide d'un pile. Plutôt que d'utiliser des piles dont le type des données est << pointeur de cellule >>, c'est-à-dire d'écrire dans le fichier définissant les opérations sur les piles
typedef tree_cell *stack_data;
ce qui devrait être modifié si on changeait le type de cellules, il est préférable de définir
typedef void *stack_data;
La fonction de parcours depth_first_iter
n'a pas besoin d'être
modifiée.