Y a-t-il une bibliothèque C bien open-source pour le stockage et la manipulation de
Variables typées dynamiquement (A.K.A. Variantes)? Je suis principalement intéressé par les valeurs atomiques (INT8, INT16, INT32, UINT, STRINGS, BLOBS, etc.), tandis que les matrices et objets de style JSON ainsi que des objets personnalisés seraient également agréables. Un cas majeur où une telle bibliothèque serait utile consiste à travailler avec des bases de données SQL.
La caractéristique la plus évidente d'une telle bibliothèque serait un seul type pour toutes les valeurs prises en charge, par exemple: p> Autres caractéristiques Pourraient inclure la conversion d'objets de variante vers / depuis des structures C (à l'aide d'une table de liaison), de convertir des valeurs vers / depuis des chaînes et de l'intégration avec une bibliothèque de données existante telle que SQLITE. P> Note : Je ne crois pas que ce soit une question est un double de toute bibliothèque pour des types de données génériques dans C? , qui fait référence à "files d'attente, arbres, cartes, listes". Ce que je parle de me concentrer davantage sur la création de bases de données SQL aussi lisse que de travailler avec eux dans des langues interprétées. P> P>
4 Réponses :
C est une langue typée très forte, les variantes ne font pas partie de sa philosophie. Une union ne peut pas être une solution car vous devez toujours choisir le type de données que vous souhaitez utiliser, il est généralement utilisé pour stocker des codes de couleur sur Si vous regardez l'interface C-SQLITE, cette fonction est fournie: P> int code> et
char [4] code> .
int sqlite_step(
sqlite_vm *pVm, /* The virtual machine to execute */
int *pN, /* OUT: Number of columns in result */
const char ***pazValue, /* OUT: Column data */
const char ***pazColName /* OUT: Column names and datatypes */
);
C est statiquement i> dactylographié, mais pas "très" fortement typé.
Pas de typage fort. Une fois que vous avez introduit le casting et de Void *, vous faites un trou dans le système de vérification de type. C n'est certainement pas fort.
Comme d'autres l'ont dit, la partie sur la «typing forte» est un problème clair.
Je suggère de lire le manuel sur le connecteur de base de données SQL. Le connecteur MySQL fournit une API pour obtenir les types de champs dans le résultat em>. p>
Vous pouvez créer une fonction usine em> qui remplit une structure basée sur le type de champ. Ironiquement, car c n'a pas de types de base, vous devrez utiliser un pointeur Void * code> et refondre le type de structure connu. (Même si
void * code> est le type que vous essayez de vous débarrasser de.) P>
J'ai fait quelque chose de similaire à celui-ci en créant un système de liaison qui définit des variables référencées par des pointeurs Void * code>. Je n'ai pas peur de
Void * code>, je veux juste qu'un cadre simple fonctionne avec des types dynamiques dans C.
Glib a la mise en œuvre de types de valeur génériques sous forme de gvalue: http://library.gnome.org/devel/gObject/unstable /gObject-generic-values.html P>
Bien que je doute que l'auteur original toujours a besoin forte> une réponse (espérons-le au moins après 4 ans), je voulais ajouter mon 2ct. p>
Tout d'abord, laissez-moi indiquer que la chose que vous demandez est appelée type de somme et généralement pris en charge dans des langages fonctionnels (c'est-à-dire qu'il s'agit plutôt d'une fonction de conception linguistique et non d'une émission de bibliothèque). P>
Deuxièmement, il est fortement douteux que vous trouverez une bibliothèque C pour cette affaire pour la simple raison que toute bibliothèque de ce type prendrait en charge un ensemble de variantes fixes qui ne correspond probablement pas à vos besoins. P>
HOperver, pour des raisons de complétude, vous voudrez peut-être donner msgpack a essayez. p>
Une variante? C utilise
void * code> pour ça ...
@KennyTM: Je ne pense pas que
void * code> est une base adéquate pour une fonction telle que "code> sqlite_fetch_object code> imité en C (sans écrire / utiliser une bibliothèque variante ou similaire).
Je ne pense pas que le mot "atomique" signifie ce que vous pensez que cela signifie.
@Jxg: Je ne parle pas de la signification de "atomique" associé à la multithreading. J'utilise le sens général du mot "ne peut pas être divisé en parties" pour faire référence à des valeurs qui ne disposent pas de nœuds d'enfants tels que des tableaux et des dictionnaires le font (bien que vous puissiez discuter que les chaînes ont des caractères et des INTS ont des bits, qui sont des bits, qui sont parties plus petites).