0

几个小时以来,我一直在尝试使用 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;
}
4

2 回答 2

0

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

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

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


至于参数和它们的用途,您可以阅读源代码

但是只要对INI 文件有一点了解,应该很容易推断出section参数是文件中的一个部分的name名称,而是当前值的名称,并且value是值本身。

所以假设一个部分和值像

[foo]
bar = something

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

并且该user参数很可能是传递给的第三个参数ini_parse

于 2020-12-20T16:08:52.580 回答
0

user显然是指向configuration您提供给的实例的指针ini_parsevoid*是 C 中可用指针的唯一类型擦除。

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

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

于 2020-12-20T16:09:04.710 回答