Type-sécurité générique des structures de données dans la plaine, vieux C?

J'ai fait beaucoup plus de la programmation en C++ de "plain old C" de la programmation. Une chose que j'ai cruellement manquer lors de la programmation dans la plaine, C est de type sécurisé générique des structures de données, qui sont fournis en C++ à l'aide de modèles.

Pour des raisons de concret, considérons un générique seule liste liée. En C++, c'est une simple question de définir votre propre modèle de classe, puis l'instancier pour les types dont vous avez besoin.

En C, je ne peux penser à quelques façons de mettre en œuvre un générique individuellement liée liste:

  1. Écrire la liste type(s) et des procédures à l'appui une fois, à l'aide de pointeurs void pour contourner le système de type.
  2. Écrire des macros du préprocesseur prendre les noms de type, etc, afin de générer un type spécifique de la version de la structure de données et des procédures de soutien.
  3. Utiliser une version plus sophistiquée, outil autonome pour générer le code pour les types dont vous avez besoin.

Je n'aime pas l'option 1, car il est subvertit le système de type, et serait susceptible d'avoir de moins bonnes performances que un type spécialisé de mise en œuvre. À l'aide d'une représentation unifiée de la structure de données pour tous les types, et le moulage à/de void pointeurs, autant que je peux voir, nécessite une indirection qui pourraient être évitées par une mise en œuvre spécialisé pour le type d'élément.

L'Option 2 ne nécessite aucun outil supplémentaire, mais il se sent un peu maladroit, et pourrait donner de mauvaises erreurs du compilateur lorsque mal utilisés.

Option 3 pourrait donner de meilleurs messages d'erreur du compilateur que l'option 2, en tant qu'institution spécialisée de données de code de structure réside dans la forme étendue qui peut être ouvert dans un éditeur et inspectés par le programmeur (par opposition au code généré par le préprocesseur macros). Toutefois, cette option est la plus lourds, une sorte de "du pauvre modèles". J'ai utilisé cette méthode avant de, à l'aide d'un simple script sed à se spécialiser un "basé sur un modèle" version de code C.

J'aimerais programme de mon avenir "bas niveau" des projets en C plutôt qu'en C++, mais ont été effrayée à l'idée de réécrire les structures de données communes pour chaque type spécifique.

Quelle est l'expérience des gens avec ce problème? Sont de bonnes bibliothèques du générique de structures de données et algorithmes en C qui ne vont pas avec l'Option 1 (c'est à dire la conversion et de void pointeurs, qui sacrifie la sécurité du type et ajoute un niveau d'indirection)?

  • Vous avez manqué 4) mettre en Œuvre pleinement polymorphe de l'objet système en c. Ce qui est beaucoup plus d'ennuis que cela vaut la peine.
  • Après avoir fait la méthode 2 quelques fois, je pense que la méthode 3 serait la façon dont je vais m'attaquer la prochaine fois. Vous pouvez mettre en œuvre 3 avec le même effort que 2, tout en obtenant de meilleurs messages d'erreur.
  • Entièrement polymorphe de l'objet système en C serait un énorme effort, et, si l'on étendait un compilateur C (plutôt que la mise en œuvre de l'objet système de bibliothèque), vous manquez sur toutes sortes de statique des garanties qui pourraient être fournis par un langage conçu avec polymorphes systèmes d'objets à l'esprit. Auquel cas: pourquoi ne pas simplement utiliser le C++? Je veux une solution simple.
  • J'ai modifié le post de souligner que je veux de sécurité de type, ce qui n'est pas fourni par l'Option 1, et je veux éviter l'indirection supplémentaire que l'utilisation d'une représentation unique pour tous les types nécessiterait.
  • Bâtiment OO en c est un grand projet, mais pas aussi grand que ça sonne (le dillo gens du projet a fait un travail décent dans une très petite quantité de code pour la v1.la série x avant de passer à c++ pour la v2.la série x). C'est juste que si vous avez besoin de toutes ces belles garantit que vous êtes presque certainement mieux à l'aide de c++ ou D ou objective-c, ou quelque chose qui a déjà eux.
  • ou il y a GObject...
  • pour la mention D 🙂
  • OpenGC3 [ voir ccxll(T) ] est-ce que vous cherchez! Cependant, il n'est pas encore terminée, et que deux sortes de listes liées mises en œuvre, mais il est suffisant pour démontrer comment construire type-sécurité générique des structures de données dans la plaine, vieux C avec la deuxième option mentionnés ci-dessus.