gpt4 book ai didi

c - 枚举C中的结构字段

转载 作者:IT王子 更新时间:2023-10-29 06:26:11 25 4
gpt4 key购买 nike

我在 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 语言编写的 native 应用程序构建 DAL(数据访问层)。我将 SQLite 用作数据库。我需要存储各种结构,并且能够插入\更新\获取(按键选择)\搜索(通过查询选择),以及创建\删除所需的表。

基本上我想要类似 Hibernate for C 的东西......

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

解决我的实际问题的不同或更好的想法也将不胜感激!

最佳答案

可以按照您的建议使用“宏魔术”来完成:

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

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

然后,在另一个 header (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 将能够自动完成您的类型,并且评论中的突出警告应该有助于防止人们将来破坏它(无论如何,您确实有这方面的测试,对吧?)

关于c - 枚举C中的结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33198702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com