AK_*_*AK_ 6 c sqlite macros struct c99
我在C中有几个结构,我想写下以下三个函数:
get_field_list(...)
get_value_by_name(...)
set_value_by_name(...)
Run Code Online (Sandbox Code Playgroud)
第一个应返回结构中定义的字段列表.第二个和第三个应该通过它的名称获取并设置到适当的字段.
我正在写结构.如果需要,我愿意使用任何宏魔法.如果生病每个结构都有三重函数,那就没关系,但通用结构更好.功能指针也很好......
基本上我想要结构的一些基本反思....
Relevent: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命令的元数据.还有一个小的"通用"模块来实现我需要的所有基本程序......
不同或更好的想法来解决我的实际问题也将不胜感激!
可以按照您的建议使用“宏魔法”来完成:
对于每个结构,创建一个头文件 ( mystruct-fields.h),如下所示:
FIELD(int, field1)
FIELD(int*, field2)
FIELD(char*, string1)
Run Code Online (Sandbox Code Playgroud)
然后,在另一个标题 ( 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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用该表来实现您的反射功能,无论您如何选择。
有可能使用另一层头文件包含,在不重写任何结构的情况下重用上述代码,因此您的顶级代码可能只需要说如下:
#define STRUCT_NAME mystruct
#include "reflectable-struct.h"
#undef STRUCT_NAME
Run Code Online (Sandbox Code Playgroud)
老实说,如果你只是正常写结构体,然后手工写出表格,那么后面的人会更容易;它更容易阅读,您的 IDE 将能够自动完成您的类型,并且注释中的突出警告应该有助于防止人们将来破坏它(无论如何,您确实对此进行了测试?)
| 归档时间: |
|
| 查看次数: |
259 次 |
| 最近记录: |