gpt4 book ai didi

c - 解开 Lua 和 C 代码以使 Lua 依赖项成为可选的

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

我用 C 编写了一个小程序来管理 SQLite3 中的书目数据库。到目前为止,这只是一个允许导入和导出 BibTeX 数据的命令行工具。为了使导出/导入功能更加可定制(例如,在导入时始终在日期字段中组合年和月字段,或在导出时跳过某些字段)这些函数是用 Lua 编写的,并从 C 调用。现在我希望 Lua 成为一个可选的依赖。这样做的好方法是什么? 即如果在编译时未找到 Lua,则退回到更基本的导入/导出功能。

现在,例如导出时,我从 SQL (sqlite3_exec) 获取数据并将其直接写入回调函数中的 Lua 表,就像这样(剥离的 stackoverflow-handling ;-)):

int db_meta_cb(void *udata, int n, char **cval, char **ckey) {
while (n-- > 0) {
lua_pushstring(L, cval[n]);
lua_setfield(L, -2, ckey[n]);
};
};

然后有一个 Lua 函数将这样一个表作为参数并漂亮地打印一个 BibTeX 条目。关于导入的类似故事:BibTeX 解析器(Lex/YACC 生成的 C 代码)编写一个 Lua 表并调用“清理”Lua 函数,然后从同一个 Lua 表中读取结果并将其插入数据库。

从我过度使用 Lua 的角度来看,这感觉不对,我猜是因为数据由(键,值)对组成。

请注意,此项目的一个原因是尝试/学习如何将 Lua 嵌入 C 中,因此请不要建议 (a) 使用可用的引用书目管理器之一,或 (b) 完全用 Python 或 Lua 重写所有内容...(顺便说一句,我已经做过了)

最佳答案

我见过解决这个问题的最优雅的方法是通过 dynamic loading .不要在运行时将程序与 lua 链接,而是尝试使用 dlopen 系列函数手动加载库。

如果此操作失败,您可以设置一个全局标志,您将需要求助于提供功能的其他方法,但如果成功,请使用 dlsym 函数从 lua 中获取函数共享对象并使用它们。您可以生成一个非常优雅的解决方案,其中您使用 lua 或遗留版本填充一些函数指针,然后您可以简单地做出一次决定并调用函数而不关心正在使用哪个实现。

关于c - 解开 Lua 和 C 代码以使 Lua 依赖项成为可选的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24637808/

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