枚举C中的结构字段

时间:2015-10-18 13:52:22

标签: c sqlite struct macros c99

我在C中有几个结构,我想编写以下三个函数:

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

第一个应该返回结构中定义的字段列表。第二个和第三个应该通过它的名称获取并设置到适当的字段。

我正在写结构。如果需要,我愿意使用任何宏魔法。如果生病每个结构都有三重函数,那就没关系,但通用结构更好。函数指针也很好......

基本上我想要对结构进行一些基本的反思......

培训相关: https://natecraun.net/articles/struct-iteration-through-abuse-of-the-c-preprocessor.html

动机

我正在尝试为用C语言编写的本机应用程序构建DAL(数据访问层)。我使用SQLite作为数据库。我需要存储各种结构,并能够插入\ update \ get(按键选择)\ search(按查询选择),还可以创建\ drop所需的表。

基本上我想要Hibernate for C ......

到目前为止,我最好的想法是使用MACRO或一些代码生成实用程序或脚本来创建我的结构以及可用于动态构建所有SQL命令的元数据。还有一个小型的通用'模块实现我需要的所有基本程序......

我们也会感激不同或更好的想法来解决我的实际问题!

3 个答案:

答案 0 :(得分:4)

可以使用"宏魔法"如你所知:

对于每个结构,创建一个头文件(mystruct-fields.h),如下所示:

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

然后,在另一个标题(mystruct.h)中,您可以根据需要多次添加:

#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

然后,您可以使用该表来实现您的反射函数,无论您选择哪种。

使用另一层头文件包含,可能有可能重用上述代码而不重写任何结构,因此您的顶级代码可能只需要说:

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

老实说,如果你只是正常地编写结构,然后手工写出来,对你来的人来说会更容易;它更容易阅读,你的IDE将能够自动完成你的类型,评论中的突出警告应该有助于防止人们在将来破坏它(无论如何,你确实有这方面的测试吗?)< / p>

答案 1 :(得分:0)

这样做的方法是让你的结构以数据库格式或xml或文本文件或任何你熟悉的格式。并使用C程序为每个结构编写.h文件。 .h文件包含结构,字段的枚举和包含每个字段名称的char数组。从那里你可以建造你需要的任何东西。最好使用程序生成器。

答案 2 :(得分:0)

看看Metaresc library。它在普通 C 语言中提供反射功能。类型定义的元数据可以从替换标准 C 类型定义语义的自定义宏语言或编译器调试信息派生。 README.md 中提供了示例应用