几乎完整的程序或者软件, 都有配置信息, 一般保存在文件中. C/C++ 语言的项目一般使用 .ini 文件作为配置文件. ini 文件和成熟的库供使用, 但缺点很明显, 很难表达父子关系, 因为配置信息应该是一根树 - 配置树.
著名的Web Server Lighttpd 使用 LEMON 来解析配置文件. 有些软件还使用 Lua/Python 等脚本语言来做配置管理. 但很多时候没有这个必要. 配置信息只要是一根树即可.
基于这个考虑, 我开发了 C/C++ 的配置管理库, 可用来做程序/软件的配置模块.
Configurations should be in the form of tree, that's what I started from. In many cases, XML/JSON, even script languages like Lua/Python are not necessary. This project develop a C/C++ library that reads configuration files which grammar uses TAB to indicate parent-child relation. I may say, it is Pythonic. The source code is quit simple and small, hope it helps you, enjoy it.
类Python语法配置文件示例:
# this is a comment author : ideawu url: http://www.ideawu.net proxy : php = host = 127.0.0.1 port = 8088 py : host = 127.0.0.1 port = 8080 cgi = pl = /usr/bin/perl
C语言应用程序读取配置文件示例:
#include <stdio.h> #include "config.h" int main(int argc, char **argv){ struct config *cfg, *c; cfg = cfg_load_file("cfg_test.conf"); if(!cfg){ return 0; } printf("\n"); printf("proxy.php.host = %s\n", cfg_getstr(cfg, "proxy.php.host")); printf("proxy.php.port = %d\n", cfg_getnum(cfg, "proxy.php.port")); printf("cgi.pl = %s\n", cfg_getstr(cfg, "cgi.pl")); printf("\n"); c = cfg_get(cfg, "author"); printf("author: %s\n", cfg_str(c)); printf("url: %s\n", cfg_getstr(c, "url")); printf("\n"); cfg_free(cfg); return 0; }