主要问题是:您是否希望配置文件使用某种图灵完整的语言(例如Python)?如果您确实希望这样做,则还可以考虑嵌入其他(如Turnle完整的)脚本语言,例如Guile或Lua(因为与Python相比,使用或嵌入它们可能被认为“更简单”;请阅读“ 扩展和嵌入Python)。我不会讨论进一步的(因为-EG其他答案由阿蒙 -讨论了深),但请注意,在你的应用程序中嵌入的脚本语言是一个重大的架构选择,你应该考虑的非常早; 我真的不建议以后再做出选择!
可以通过“脚本”进行配置的程序的一个著名示例是GNU emacs编辑器(或专有领域中的AutoCAD)。因此请注意,如果您接受脚本编写,则某些用户最终会广泛使用该工具(可能会滥用),并制作成千上万行的脚本;因此,选择足够好的脚本语言非常重要。
但是(至少在POSIX系统上),您可能认为方便在初始化时动态计算配置“文件”(当然,将合理配置的负担留给了系统管理员或用户;实际上它是一种配置)来自某个文件或命令的文本)。为此,您可以简单地采用一种约定(并将其记录下来),即以a !
或a 开头的配置文件路径|
实际上是要作为管道读取的shell 命令。这使您的用户可以选择使用他最熟悉的“预处理器”或“脚本语言”。
(如果您接受动态计算的配置,则需要让用户信任安全问题)
因此,在您的初始化代码中,您main
将(例如)接受一些--config
参数 confarg
并从中获取一些参数FILE*configf;
。如果该参数以!
(即(confarg[0]=='!')
....)开头,则可以使用configf = popen(confarg+1, "r");
并关闭该管道pclose(configf);
。否则,您将使用configf=fopen(confarg, "r");
并关闭该文件fclose(configf);
(不要忘记进行错误检查)。参见pipe(7),popen(3),fopen(3)。对于以Python编码的应用程序,请阅读有关os.popen等的信息。
(文件还为希望通过名为的配置文件中的怪异用户!foo.config
通过./!foo.config
绕过popen
上述特技)
顺便说一句,这种技巧只是一种方便(避免要求高级用户例如编写一些shell脚本来生成配置文件)。如果用户要报告任何错误,则应将生成的配置文件发送给您...
注意,您还可以设计具有在初始化时使用和加载插件的功能的应用程序,例如使用dlopen(3)(并且您需要让用户信任该插件)。同样,这是一个非常重要的体系结构决策(您需要定义并提供有关这些插件和应用程序的相当稳定的API和约定)。
对于以脚本语言(如Python)编码的应用程序,您还可以接受一些用于eval或exec或类似基元的程序参数。同样,(高级)用户会担心安全问题。
关于您的配置文件中的文本格式(无论是产生或没有),我相信你大多需要记录它好(和一些特定格式的选择是不那么重要,但是我建议让您的用户能够把里面有一些跳过的注释)。你可以使用JSON(最好带些JSON解析器接受和跳过与通常的意见//
,直至停产或/*
... */
...),或YAML或XML,或INI或你自己的事情。解析配置文件相当容易(并且您会发现许多与该任务相关的库)。