V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w1lu0bOo
V2EX  ›  C++

如何适应? C 艹程序员做 ANSI C 的项目

  •  
  •   w1lu0bOo · 315 天前 · 3339 次点击
    这是一个创建于 315 天前的主题,其中的信息可能已经有所发展或是发生改变。

    别说 STD 和 C++11+ 了,class, template 都用不了,完全束手束脚的感觉,要怎么适应呢?

    44 条回复    2023-08-12 10:27:35 +08:00
    tool2d
        1
    tool2d  
       315 天前
    写 C++代码,然后源码转译到 C 代码。
    zhuangzhuang1988
        2
    zhuangzhuang1988  
       315 天前
    学习 libuv mruby libgit2 的代码
    koebehshian
        3
    koebehshian  
       315 天前   ❤️ 1
    嵌入式表示,有时连 malloc 都用不了
    duke807
        4
    duke807  
       315 天前 via Android
    c 写面向对象没啥问题,参考 linux kernel 的 container_of 方式。
    譬如看一下我这个目录的 mcu 代码,其中有好几种驱动,它们都基于同一个子类型:
    https://github.com/dukelec/cdnet/tree/master/dev

    template 没啥用,需要的话用宏定义就行,还可以配合 typeof 和新的 _Generic 关键字
    duke807
        5
    duke807  
       315 天前 via Android
    @koebehshian

    我喜欢把数组转成链表,用来做固定大小的内存分配,不担心实时性和内存碎片

    譬如这个文件开头的 init 函数:
    https://github.com/dukelec/cdcam/blob/master/cam_fw/usr/app_main.c
    cnbatch
        6
    cnbatch  
       315 天前
    @duke807 OP 特意强调“ANSI C”,很大可能性是 C89 ,想用_Generic ?不存在的。搞不好连 for 循环第 1 个分号前的初始化语句都不能声明变量。
    如果真的是 C89 ,那就属于是连 Linus 都不得不抛弃的版本。
    cnbatch
        7
    cnbatch  
       315 天前
    同情 OP 。
    说实话,我也很难适应这么老旧的语言标准,无论是 C89 还是 C++98 。
    因为我很不爽这两个旧标准,以至于很长时间内我都泡在 C# 生态当中,连 QT 都不想碰。直到后来无意中被所谓的“析构”(Finalizers) “坑”了一把(毕竟写 Dispose 实在啰嗦)。

    恰好,此时 C++11 和 C11 已经发布了,我一看新内容,还好能够接受。于是工作以外的场景就重新入门了。
    工作场景仍然是 C# 为主(我没换工作),但工作时的自用工具会尽量用新标准 C++去写(能 C++就 C++,我懒),除非遇到公司的老旧 RHEL 只提供 GCC4.8 那才没办法,还好可以用大部分 C11 特性(其他组淘汰给我们当玩具的,没多久就清理掉了)。

    经历过新标准的爽快被迫再退回去几十年前的标准,我很理解 OP 的心情。

    换成是我,那就只能先用 C++写一遍具体代码,然后转写成等效同年份 C 代码,再根据编译器的错误提醒,进一步回退到 C89 。
    1423
        8
    1423  
       315 天前
    硬着头皮,扛过去就好了。。
    hanxiV2EX
        9
    hanxiV2EX  
       315 天前 via Android
    lua 源码还是 ansi c
    ederodan
        10
    ederodan  
       314 天前
    往好处想这是是一个提高自己内存管理能力的好机会
    tairan2006
        11
    tairan2006  
       314 天前
    用 GObject?
    cstj0505
        12
    cstj0505  
       314 天前
    同时在写 java ,c ,sql ,放平心态就好,c 就不要想着快速出活,对自己编码和算法细节的打磨很重要
    yolee599
        13
    yolee599  
       314 天前 via Android
    C 挺好的,可以慢慢研究
    zhyl
        14
    zhyl  
       314 天前
    写 vlang ,然后编译成 c 代码
    aa514758835
        15
    aa514758835  
       314 天前
    确实不方便,可以在 github 上先正好三方基础库,老外写的纯 c 的基础库很不错的,有脚手架,就好干活了
    minami
        16
    minami  
       314 天前
    glib 一把梭,除了啰嗦基本啥都有
    m1a0
        17
    m1a0  
       314 天前
    返璞归真, 挺好的, 适应了就好。
    LXGMAX
        18
    LXGMAX  
       314 天前
    自动挡换手动挡自然要熟悉适应
    lovelylain
        19
    lovelylain  
       314 天前 via Android
    是机器上没有 c++运行库还是项目代码是纯 c ,后者的话用 c++实现功能编译成 so 给 c 调用。
    hpepper
        20
    hpepper  
       314 天前
    能否添加个联系方式 我这有个 c++的问题,可以有偿。
    w1lu0bOo
        21
    w1lu0bOo  
    OP
       314 天前
    感谢那么多回复。
    w1lu0bOo
        22
    w1lu0bOo  
    OP
       314 天前
    我先理一理……
    koebehshian
        23
    koebehshian  
       314 天前
    @duke807
    我之前也是,喜欢用静态变量,类似于内存池自己管理,但这只适用于业务逻辑比较简单或内存充足的场景。
    我碰到业务逻辑复杂且内存少的情况,就必须动态分配了。比如有 10 个功能,用户可能只用1个功能,也可能用2个,不确定,这是由用户动态配置的,编译时是确定不了的。

    每个功能涉及到的结构体的长度不同的,如果用联合体就比较浪费,如果分别预先定义最大长度,更加浪费,导致每个功能的最大负荷降低。
    macha
        24
    macha  
       313 天前
    如果是老项目的话,基本上常用的轮子都有了,学习一下他们的套路就行了。
    新项目的话,直接换语言吧。
    C 语言实在不适合写业务太复杂的项目。
    最适合那种精雕细琢的项目,扣内存,扣 CPU ,扣字节,深扣一切。。。
    w1lu0bOo
        25
    w1lu0bOo  
    OP
       311 天前
    @tool2d 工程量巨大 /(ㄒoㄒ)/~~
    w1lu0bOo
        26
    w1lu0bOo  
    OP
       311 天前
    @zhuangzhuang1988 嗯嗯,找一些库学习一下是个好路径 👍
    w1lu0bOo
        27
    w1lu0bOo  
    OP
       311 天前
    @duke807 感谢具体的建议♥
    w1lu0bOo
        28
    w1lu0bOo  
    OP
       311 天前
    @cnbatch 上学的时候叫惯了 ANSI C 哈哈哈,目前 for 循环第一个分号初始化语句还是可以用的😄

    感谢建议~
    w1lu0bOo
        29
    w1lu0bOo  
    OP
       311 天前
    @ederodan √,要是有(hen)空(xian)的话是可以对照着智能指针的实现看看学学 /(ㄒoㄒ)/~~
    w1lu0bOo
        30
    w1lu0bOo  
    OP
       311 天前
    @tairan2006 嗯,有些建议是用 glib ,不过要拖入一堆依赖,不知道大项目 maintainer 会不会同意😄
    w1lu0bOo
        31
    w1lu0bOo  
    OP
       311 天前
    @cstj0505 太厉害了,多门语言无缝切换~
    w1lu0bOo
        32
    w1lu0bOo  
    OP
       311 天前
    @zhyl 感谢信息。 看它官网有一句 "V can be bootstrapped in under a second by compiling its code translated to C with a simple..." 实际使用上转成 C 语言有没有什么局限性呢?
    w1lu0bOo
        33
    w1lu0bOo  
    OP
       311 天前
    @aa514758835 嗯嗯,不知道有没有比较广泛使用的替代 C++11/14/17 的高级语法? 大几年没写 C 了。
    w1lu0bOo
        34
    w1lu0bOo  
    OP
       311 天前
    @minami 哈哈哈哈哈哈
    w1lu0bOo
        35
    w1lu0bOo  
    OP
       311 天前
    @minami 感谢信息
    w1lu0bOo
        36
    w1lu0bOo  
    OP
       311 天前
    @lovelylain 主要是运行环境( flash )都容不下一个 libstdc++.so 的运行库 。。。。 嗯嗯,C++暴露出 C 接口是一个好路径
    w1lu0bOo
        37
    w1lu0bOo  
    OP
       311 天前
    @koebehshian 那大概率是没有 OS 的场景吧? malloc 都没有 /(ㄒoㄒ)/~~
    w1lu0bOo
        38
    w1lu0bOo  
    OP
       311 天前
    @macha 就怕产品经理又要多快好省…… 天天 cuicuicuicuicui
    w1lu0bOo
        39
    w1lu0bOo  
    OP
       311 天前
    @hpepper 大概什么方面的问题呢? 方便的可以一起讨论讨论
    cnbatch
        40
    cnbatch  
       311 天前
    如果能用 C11 ,那么不少特性都能继续保留
    比如 std::atomic thread_local static_assert bool
    只不过需要加下划线

    https://en.cppreference.com/w/c/99
    https://en.cppreference.com/w/c/11
    zhyl
        41
    zhyl  
       310 天前
    @w1lu0bOo #32 可能内存管理这方面要注意,vlang 的内存管理模式在编译的时候指定,分为自动 gc ,自动插入 free ,以及手动管理。之前尝试的时候内存管理这块还没解决,不知道现在如何了,还会不会在自动 gc 或 free 时有内存泄漏的问题。
    zhyl
        42
    zhyl  
       310 天前
    @zhyl #41 再者 vlang 现在还没有到 1.0 ,语法上也并不稳定,可能也是一个大坑
    iceheart
        43
    iceheart  
       295 天前 via Android
    只是 libstdc++库依赖的问题?可以链接静态库版本啊。
    zzzkkk
        44
    zzzkkk  
       250 天前
    @duke807
    大佬 做嵌入式 卖摄像头的吗?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   986 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 22:11 · PVG 06:11 · LAX 15:11 · JFK 18:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.