有没有办法转储C结构?

Sch*_*ern 8 c json struct

我编写了一个程序来探测系统的C time.h函数的限制,并将它们转储到JSON中.那么依赖于这些功能的其他东西可以知道它们的极限.

# system time.h limits, as JSON
{
    "gmtime": { "max": 2147483647, "min": -2147483648 },
    "localtime": { "max": 2147483647, "min": -2147483648 },
    "mktime": {
        "max": { "tm_sec": 7, "tm_min": 14, "tm_hour": 19, "tm_mday": 18, "tm_mon": 0, "tm_year": 138, "tm_wday": 1, "tm_yday": 17, "tm_isdst": 0 },
        "min": { "tm_sec": 52, "tm_min": 45, "tm_hour": 12, "tm_mday": 13, "tm_mon": 11, "tm_year": 1, "tm_wday": 5, "tm_yday": 346, "tm_isdst": 0 }
    }
}
Run Code Online (Sandbox Code Playgroud)

gmtime()和localtime()很简单,只需要数字,但mktime()需要一个tm结构.我编写了一个自定义函数来将tm结构转换为JSON哈希.

/* Dump a tm struct as a json fragment */
char * tm_as_json(const struct tm* date) {
    char *date_json = malloc(sizeof(char) * 512);
#ifdef HAS_TM_TM_ZONE
    char zone_json[32];
#endif
#ifdef HAS_TM_TM_GMTOFF
    char gmtoff_json[32];
#endif

    sprintf(date_json,
            "\"tm_sec\": %d, \"tm_min\": %d, \"tm_hour\": %d, \"tm_mday\": %d, \"tm_mon\": %d, \"tm_year\": %d, \"tm_wday\": %d, \"tm_yday\": %d, \"tm_isdst\": %d",
            date->tm_sec, date->tm_min, date->tm_hour, date->tm_mday,
            date->tm_mon, date->tm_year, date->tm_wday, date->tm_yday, date->tm_isdst
    );

#ifdef HAS_TM_TM_ZONE
    sprintf(&zone_json, ", \"tm_zone\": %s", date->tm_zone);
    strcat(date_json, zone_json);
#endif
#ifdef HAS_TM_TM_GMTOFF
    sprintf(&gmtoff_json", \"tm_gmtoff\": %ld", date->tm_gmtoff);
    strcat(date_json, gmtoff_json);
#endif

    return date_json;
}
Run Code Online (Sandbox Code Playgroud)

对于任何给定的结构,有没有办法一般地执行此操作?

注意:C,而不是C++.

wal*_*lyk 4

至少在 C\xe2\x80\x94 中不是这样。但是,如果 C 模块是使用调试符号编译的,并且目标模块可用,则您可以对其进行解析并发现有关该结构的所有内容。我敢打赌你的系统有一个库可以帮助你做到这一点。

\n