funciones estructuras ejemplos dev con arreglo array anidadas c sqlite struct macros c99

ejemplos - funciones con estructuras en c



enumerando sobre los campos de una estructura en C (2)

La forma de hacerlo es tener su estructura en un formato de base de datos o xml o un archivo de texto o cualquier formato con el que se sienta cómodo. Y use un programa C para escribir un archivo .h para cada estructura. El archivo .h contiene la estructura, una enumeración de los campos y una matriz de caracteres que contiene los nombres de cada campo. Desde allí puedes construir todo lo que necesites. Preferiblemente usando un generador de programa.

Tengo varias estructuras en C y quiero escribir las siguientes tres funciones:

get_field_list(...) get_value_by_name(...) set_value_by_name(...)

El primero debería devolver la lista de campos definidos en la estructura. El segundo y el tercero deben obtener y establecer en el campo apropiado por su nombre.

Estoy escribiendo las estructuras. Estoy dispuesto a usar cualquier magia macro si es necesario. Está bien si tengo un trío de funciones por cada estructura, pero las estructuras genéricas son mejores. Los punteros de función también están bien ...

Básicamente quiero algunas reflexiones elementales para las estructuras ...

Importante: https://natecraun.net/articles/struct-iteration-through-abuse-of-the-c-preprocessor.html

motivación

Estoy intentando construir un DAL (Capa de acceso a datos) para una aplicación nativa escrita en C. Estoy usando SQLite como DB. Necesito almacenar varias estructuras, y poder insertar / update / get (seleccionar por clave) / search (seleccionar por consulta), y también para crear / drop the required table.

Básicamente, quiero algo como Hibernate para C ...

Mi mejor idea hasta ahora es usar MACRO, o alguna utilidad de generación de código, o un script, para crear mis estructuras junto con los metadatos que podría usar para construir dinámicamente todos mis comandos SQL. Y también para tener un pequeño módulo ''genérico'' para implementar todos los procedimientos básicos que necesito ...

¡También se apreciarán ideas diferentes o mejores para resolver mi problema real!


Se puede hacer con "macro magia" como sugirió:

Para cada estructura, cree un archivo de encabezado ( mystruct-fields.h ) como este:

FIELD(int, field1) FIELD(int*, field2) FIELD(char*, string1)

Luego, en otro encabezado ( mystruct.h ) lo incluye tantas veces como necesite:

#define FIELD(T,N) T N; struct mystruct { #include "mystruct-fields.h" }; #undef FIELD #define FIELD(T,N) { STRINGIFY(T), STRINGIFY(N), offsetof(mystruct, N) }, #define STRINGIFY1(S) #S #define STRINGIFY(S) STRINGIFY1(S) struct mystruct_table { struct { const char *type, *name; size_t offset; } field[]; } table = { #include "mystruct-fields.h" {NULL, NULL, 0} }; #undef FIELD

Luego puede implementar sus funciones de reflexión, utilizando la tabla, como lo elija.

Podría ser posible, utilizando otra capa de archivo de encabezado, reutilizar el código anterior para cualquier estructura sin reescribirlo, por lo que su código de nivel superior solo debería decir algo como:

#define STRUCT_NAME mystruct #include "reflectable-struct.h" #undef STRUCT_NAME

Honestamente, es más fácil para las personas que te siguen si solo escribes la estructura normalmente, y luego escribes la tabla a mano; es mucho más fácil de leer, su IDE podrá autocompletar sus tipos, y las advertencias prominentes en los comentarios deberían ayudar a evitar que las personas lo rompan en el futuro (y de todos modos, ¿tiene pruebas para este derecho?)