c - 有没有办法转储 C 结构?

标签 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
    }
  }
}

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;
}

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

注意:C,不是 C++。

最佳答案

不是在 C 语言中——至少一般情况下是这样。但是,如果 C 模块是使用调试符号编译的,并且目标模块可用,则您可以对其进行解析并发现有关结构的所有内容。我敢打赌,您的系统中有一个库可以帮助您。

关于c - 有没有办法转储 C 结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2250108/

相关文章:

Java/Android - 用于创建新多消息聊天的 JSON 解析仅生成一条消息

c - 在c中处理文件和结构

c - 通过外部库传递变量

c - 按字母顺序对 C 中的字符指针数组进行排序时出现段错误

javascript - 如何向此嵌套 JSON 对象添加追加

c - PowerPC 编译器的结构体数组

c - C如何处理结构赋值

C - 释放一定量的内存(char**)

c - (char* )'r' 和 "r"之间有什么区别?

php - 使用 JSON 和 PHP 创建注册 API