我不明白 inih 是如何工作的

I don't understand how inih works

几个小时以来,我一直在尝试使用 inih lib 读取 ini 文件,但我仍然不完全理解这段代码,尤其是 configuration* pconfig = (configuration*)user;,处理函数的参数是什么?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "../ini.h"

typedef struct
{
    int version;
    const char* name;
    const char* email;
} configuration;

static int handler(void* user, const char* section, const char* name,
                   const char* value)
{
    configuration* pconfig = (configuration*)user;

    #define MATCH(s, n) strcmp(section, s) == 0 && strcmp(name, n) == 0
    if (MATCH("protocol", "version")) {
        pconfig->version = atoi(value);
    } else if (MATCH("user", "name")) {
        pconfig->name = strdup(value);
    } else if (MATCH("user", "email")) {
        pconfig->email = strdup(value);
    } else {
        return 0;  /* unknown section/name, error */
    }
    return 1;
}

int main(int argc, char* argv[])
{
    configuration config;

    if (ini_parse("test.ini", handler, &config) < 0) {
        printf("Can't load 'test.ini'\n");
        return 1;
    }
    printf("Config loaded from 'test.ini': version=%d, name=%s, email=%s\n",
        config.version, config.name, config.email);
    return 0;
}

user 是“通用指针”或“无类型指针”。

取消引用该指针会给你一个 void 类型的值,这是不可能的。

因此您必须将指针转换为正确的类型才能使用它。


至于参数及其用途,您可以read the source

但是稍微了解一下INI files应该很容易推断出section参数是文件中一个节的名称,而name是当前值名称,value 是值本身。

所以假设一个部分和值像

[foo]
bar = something

那么section就是"foo"name就是"bar"value就是"something"

user参数很可能是传递给ini_parse的第三个参数。

user 显然是指向 configuration 你给 ini_parse 实例的指针。 void* 只是 C 中可用的指针类型擦除。

section 是 .ini 文件部分的名称, name 是键名,value 是键的值。

ini_parse 为每个键调用处理程序,传递它 configuration 和解析迭代的结果。处理程序如何处理该信息,将由库的用户定义。