如何使用文件,环境和/或命令行初始化C程序?

Rob*_*Kam 5 c configuration ini initialization

在C中,如何使用键值对配置某些程序的初始设置,使用以下任何一个或全部:命令行上的纯文本配置文件,环境变量和选项.此外,如何确定哪个方法的值超过其他两个方法中的任何一个.然后,如果已更改值,则可以选择更新配置文件.

最简单的方法是什么?如果有的话,最常用的方法是什么?是否有一个,最好是小型的开源程序,它提供了一个很好的例子来说明如何做到这一点?

Tob*_*obi 5

基础:

  • 要使用环境变量配置程序,可以使用stdlib.h中定义的getenv函数.
  • 要使用命令行参数配置程序,请将主函数声明为'int main(int argc,const char*const*argv)',并使用循环来遍历argv数组中的参数.它的大小由argc给出.
  • 要使用配置文件配置程序,最好选择一些为您执行此操作的库,而不是发明另一种自定义配置文件格式.请注意,根据您定位的平台,还有用于解析命令行参数的库.

哪个设置源应该相互覆盖取决于应用程序,但在我看来,一般命令行参数>环境变量>配置文件最有意义.

以下是使用命令行覆盖环境从环境和命令行获取配置的示例:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, const char* const* argv) {
    int i;
    const char* myConfigVar;

    // get default setting from environment
    myConfigVar = getenv("MY_CONFIG_VAR");

    // if the variable wasn't defined, initialize to hardcoded default
    if (!myConfigVar)
        myConfigVar = "default value";

    // parse commandline arguments
    // start at 1, because argv[0] contains the name of the program
    for (i = 1; i < argc; ++i) {
        if (strcmp("--my-config-var", argv[i]) == 0) {
            if (i + 1 < argc)
                myConfigVar = argv[i + 1];
            else
                printf("missing value for my-config-var argument\n");
        }
    }

    printf("myConfigVar = '%s'\n", myConfigVar);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

您已经看到它很快变得非常冗长乏味,因此如果存在所需的目标平台,或者至少将这种代码考虑到许多函数中,那么最好使用现有的库.

另一个有趣的选择是将脚本语言绑定到您的应用程序,然后您可以使您的应用程序只读取并"执行"您的设置文件,用户可以配置设置文件以从环境中读取一些设置,从命令行读取一些设置,例如.这实际上取决于应用程序的类型和大小以及目标受众是否值得这样做.


Ste*_*ows 5

Eric Raymond在Unix编程的第10部分中介绍了很多这方面.显然,这是以Unix为中心的,但大多数原则都适用于任何操作系统.