2010-04-29 8 views
7

¿Existe una biblioteca C de código abierto decente para almacenar y manipular
variables de tipo dinámico (variantes a.k.a.)? Me interesan principalmente los valores atómicos (int8, int16, int32, uint, cadenas, blobs, etc.), mientras que las matrices y objetos estilo JSON, así como los objetos personalizados, también serían buenos. Un caso importante donde tal biblioteca sería útil es trabajando con bases de datos SQL.Biblioteca de tipos de datos de variantes para C

La característica más obvia de tal biblioteca habría un solo tipo para todos los valores admitidos, por ejemplo:

struct Variant { 
    enum Type type; 
    union { 
     int8_t int8_; 
     int16_t int16_; 
     // ... 
    }; 
}; 

Otras características pueden incluir la conversión de objetos Variant a/de estructuras C (utilizando una tabla de unión), convertir valores a/desde cadenas e integración con una biblioteca de base de datos existente como SQLite.

Nota: No creo que esta es una pregunta es un duplicado de Any library for generic datatypes in C?, que se refiere a "colas, árboles, mapas, listas". De lo que estoy hablando se enfoca más en hacer que trabajar con bases de datos SQL sea más sencillo que trabajar con ellos en lenguajes interpretados.

+0

¿Variant? C usa 'void *' para eso ... – kennytm

+0

@KennyTM: No creo que 'void *' sea una base adecuada para una función como el 'sqlite_fetch_object' de PHP imitado en C (sin escribir/usar una biblioteca de variantes o similar). –

+1

No creo que la palabra "atómico" signifique lo que piensas que significa. – JXG

Respuesta

-4

C es un lenguaje tipado muy fuerte, las variantes no son parte de su filosofía. Una unión no puede ser una solución porque todavía tiene que elegir el tipo de datos que desea usar, normalmente se usa para almacenar códigos de color en int y char[4].

Si nos fijamos en la interfaz de C-SQLite, se proporciona esta función:

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 */ 
); 

tipos de datos están representados por char * y es tarea del desarrollador para averiguar cómo conseguir los tipos de éstas. Creo que cualquier tipo de variante hubiera sido mejor, pero simplemente no es C. C no implementa variantes y no está destinado a hacerlo.

+3

C está * estáticamente * tipado, pero no "muy" fuertemente tipado. – kennytm

+3

Sin tipa fuerte. Una vez que introduces el fundido desde y hacia el vacío *, haces un agujero en el sistema de verificación de tipos. C definitivamente no es fuerte tipeado. –

+0

Como han dicho otros, la parte sobre "tipificación fuerte" es completamente incorrecta. – choeger

0

Sugiero leer el manual en el conector de la base de datos SQL. El conector MySQL proporciona una API para obtener los tipos de campo en el resultado .

Puede crear una función Fábrica que rellena una estructura según el tipo de campo. Irónicamente, dado que C no tiene tipos base, tendrá que usar un puntero void * y volver a estructurar el tipo de estructura conocido. (A pesar de que void * es el tipo que está tratando de deshacerse de él.)

+0

Hice algo similar a esto creando un sistema vinculante que establece variables referenciadas por punteros 'void *'. No le temo a 'void *', solo quiero un framework simple para trabajar con tipos dinámicos en C. –

3

Aunque dudo que el autor original todavía necesidades una respuesta (afortunadamente al menos después de 4 años), quería agregar mi 2ct.

Primero, permítanme decirles que lo que solicitan se llama suma y generalmente es compatible con los lenguajes funcionales (es decir, es más bien una función de diseño de idioma y no de biblioteca).

En segundo lugar, es muy dudoso que encuentre una biblioteca C para ese caso por la sencilla razón de que dicha biblioteca admitiría un conjunto fijo de variantes que probablemente no satisfaga sus necesidades.

Howerver, en aras de la integridad, es posible que desee probar msgpack.

Cuestiones relacionadas