我有一个可执行文件,运行时应该从脚本文件中获取configuration参数。 这样我不需要重新编译每个configuration更改的代码。 现在我有一个.h文件中的所有configuration值。 每次我改变它,我需要重新编译。
该平台是Linux下的C,gcc。
这个问题最好的解决scheme是什么? 我仰望谷歌和XML,Ph和Lua绑定为C.是否使用单独的脚本语言最好的方法? 如果是这样,你会推荐哪一个我的需要?
附录:如果我想在脚本文件中镜像数据结构怎么办? 如果我有一个结构数组,例如,如果有一个简单的方法来存储和加载它?
使用IntelliJ IDE和Lua编程语言制作Corona应用程序
有没有办法使用grep(或任何其他工具)过滤文本文件,以便您可以获取包裹在护腕或括号中的文件的一部分?
lua套接字客户端
如何在ubuntu上更新lua软件包?
哪种脚本语言更适合在multithreadingC / C ++应用程序中embedded
谢谢
os.execute()与命令行选项
lua dofile“没有这样的文件或目录”在Windows中
为什么lua的string模式匹配这样做?
创build独立的Lua可执行文件
在Win7上安装Torch7; cmake和PATH问题
我建议Lua 。 它是为配置而设计的。
key = value key2 = anothervalue .... keyn = etc
然后你只需打开这个文件并解析它,把所有的东西都放在hashmap / dictionary中。
在google上快速搜索出来一个库( libConfuse ),可以为你做这个。
检查CCAN ciniparser 。 它是原始iniparser (不再维护)的一个分支,使解析INI风格的配置文件变得简单。
从示例代码(几乎被单元测试镜像):
#include <stdio.h> #include <stdbool.h> #include <ccan/ciniparser/ciniparser.h> #define CONfig_FILE "/etc/config.ini" int main(int argc,char *argv[]) { dictionary *d; char *val1; bool val2; double val3; int val4; d = ciniparser_load(CONfig_FILE); if (d == NULL) return 1; val1 = ciniparser_getstring(d,"daemon:pidfile",NULL); val2 = ciniparser_getboolean(d,"daemon:debug",false); val3 = ciniparser_getdouble(d,"daemon:maxload",3.5); val4 = ciniparser_getint(d,"daemon:maxchild",5); ciniparser_freedict(d); return 0; }
当然,你可以删除树中需要的几个文件和#include "iniparser.h" ,除非你想运行单元测试,否则对其他CCAN模块没有依赖关系。
示例配置可能如下所示:
[stooges] larry=larry_stooge curly=curly_stooge moe=moe_stooge shemp=questionable [cartoons] tom_hates=jerry
获取stooges:shemp的价值stooges:shemp会产生一个静态分配的questionable ,您将按原样使用(不进行修改)或分配和复制(即strdup() )。 这并不容易。 用简单的互斥体和线程安全地访问字典。
CCAN是综合C归档网络。 认为CPAN ,只是C 它的一个项目Rusty Russell刚开始,最终获得了一些牵引力。
免责声明:我维护模块。
纯文本文件有什么问题? 这些配置设置是在应用程序启动时读取一次,还是在应用程序的整个生命周期中一直读取? 他们什么时候写的? 这听起来像只在应用程序开始时才读取一次,因为每次更改时都需要重新编译。
如果只有少数值,那么我会说保持简单,并坚持使用格式化为键/值对的文本文件:
Config1 = 1 ConfigValue2 = 33.4 ConfigValue3 = ABC
如果你有更复杂的设置,也许有一些价值层次,XML可能更有意义。
你需要多少配置才能成为“脚本文件”?
当收到SIGUSR1等信号时,可以重新读取配置文件。
您可以将所有配置值存储在外部,并使用旧的普通C读取
你可以做一些事情:
并用fgets正常读取,然后做一个strtok寻找'=',然后你有参数和值。
如果你想使用XML,我建议你使用libxml2。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。