V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
gyf304
V2EX  ›  分享创造

Show V2EX: cmarshal: C struct JSON 序列化 / 反序列化代码生成器

  •  
  •   gyf304 ·
    gyf304 · 2021-02-15 14:35:46 +08:00 · 1556 次点击
    这是一个创建于 1158 天前的主题,其中的信息可能已经有所发展或是发生改变。

    只需要给你的 C struct 加如下的一行注释就可以用 cmarshal 自动生成 JSON 序列化 / 反序列化代码。

    /* cmarshal:`true` */
    

    可以不费吹灰之力实现在 C 语言中实现 JSON 配置文件的读取。

    GitHub

    觉得有意思的话帮忙加个星

    6 条回复    2021-02-18 20:06:03 +08:00
    justin2018
        1
    justin2018  
       2021-02-16 11:28:04 +08:00
    很棒的工具 多谢分享
    codehz
        2
    codehz  
       2021-02-17 03:08:20 +08:00
    听起来用了 clang 做源码识别。。
    是不是可以做成 clang plugin 的形式呢?毕竟写注释看起来海曙不太自然(
    gyf304
        3
    gyf304  
    OP
       2021-02-17 06:25:43 +08:00
    @codehz 写注释还是有必要的 因为一个头文件可能只要 1 个类型需要生成 还有就是对于 struct field 的标记 例如改 key,或者不输出某一个 field 这个其实有点借鉴了 golang 的 struct tag
    codehz
        4
    codehz  
       2021-02-17 07:23:29 +08:00
    @gyf304 #3 其实我的意思是做成自定义 attribute
    CismonX
        5
    CismonX  
       2021-02-18 13:14:28 +08:00
    @codehz 我觉得自定义 attribute,不如楼主的这种实现方式

    首先,__attribute__ 关键字是 gcc 独有的(虽然 clang 这种与 gcc 高度兼容的编译器也支持),所以从兼容角度来看并不好。再加上这是一个 clang plugin,那就更麻烦了。即使用的就是 clang,为了在 plugin 不存在的时候不报 warning (-Wunknown-attributes ),需要检测那个自定义 attribute 是否存在,而这不能简单地用一个 #ifdef 实现,而是需要依靠构建脚本(参考 AX_GCC_FUNC_ATTRIBUTE 的实现,是构造一段带有指定 attribute 的代码,然后尝试编译,看看有没有 warning )。

    其次,clang plugin 这种东西,它存在的主要价值在于干预编译过程。而楼主这个项目只需要分析代码,所以没有必要采用这种侵入性强的实现。曾经见过一个类似的项目,实现了自定义 #pragma,也是存在这个问题。
    codehz
        6
    codehz  
       2021-02-18 20:06:03 +08:00
    @CismonX #5 (但是好处就是可以不用落盘,不需要实际的生成文件。。。
    可以做成多种模式,毕竟如果项目已经依赖于 clang 插件的时候,就不需要在意再多一个了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4215 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 01:02 · PVG 09:02 · LAX 18:02 · JFK 21:02
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.