如何适应? C 艹程序员做 ANSI C 的项目 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w1lu0bOo
V2EX    C++

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

  •  
  •   w1lu0bOo 2023-06-08 20:44:10 +08:00 4176 次点击
    这是一个创建于 854 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    template 没啥用,需要的话用宏定义就行,还可以配合 typeof 和新的 _Generic 关键字
    duke807
        5
    duke807  
       2023-06-09 00:43:35 +08:00 via Android
    @koebehshian

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

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

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

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

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

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

    感谢建议~
    w1lu0bOo
        29
    w1lu0bOo  
    OP
       2023-06-12 22:48:46 +08:00
    @ederodan √,要是有(hen)空(xian)的话是可以对照着智能指针的实现看看学学 /(ㄒoㄒ)/~~
        30
    w1lu0bOo  
    OP
       2023-06-12 22:49:34 +08:00
    @tairan2006 嗯,有些建议是用 glib ,不过要拖入一堆依赖,不知道大项目 maintainer 会不会同意
    w1lu0bOo
        31
    w1lu0bOo  
    OP
       2023-06-12 22:50:02 +08:00
    @cstj0505 太厉害了,多门语言无缝切换~
    w1lu0bOo
        32
    w1lu0bOo  
    OP
       2023-06-12 22:53:43 +08:00
    @zhyl 感谢信息。 看它官网有一句 "V can be bootstrapped in under a second by compiling its code translated to C with a simple..." 实际使用上转成 C 语言有没有什么局限性呢?
    w1lu0bOo
        33
    w1lu0bOo  
    OP
       2023-06-12 22:55:23 +08:00
    @aa514758835 嗯嗯,不知道有没有比较广泛使用的替代 C++11/14/17 的高级语法? 大几年没写 C 了。
    w1lu0bOo
        34
    w1lu0bOo  
    OP
       2023-06-12 22:56:18 +08:00
    @minami 哈哈哈哈哈哈
    w1lu0bOo
        35
    w1lu0bOo  
    OP
       2023-06-12 22:58:27 +08:00
    @minami 感谢信息
    w1lu0bOo
        36
    w1lu0bOo  
    OP
       2023-06-12 23:00:14 +08:00
    @lovelylain 主要是运行环境( flash )都容不下一个 libstdc++.so 的运行库 。。。。 嗯嗯,C++暴露出 C 接口是一个好路径
    w1lu0bOo
        37
    w1lu0bOo/strong>  
    OP
       2023-06-12 23:01:52 +08:00
    @koebehshian 那大概率是没有 OS 的场景吧? malloc 都没有 /(ㄒoㄒ)/~~
    w1lu0bOo
        38
    w1lu0bOo  
    OP
       2023-06-12 23:02:41 +08:00
    @macha 就怕产品经理又要多快好省…… 天天 cuicuicuicuicui
    w1lu0bOo
        39
    w1lu0bOo  
    OP
       2023-06-12 23:10:51 +08:00
    @hpepper 大概什么方面的问题呢? 方便的可以一起讨论讨论
    cnbatch
        40
    cnbatch  
       2023-06-12 23:45:50 +08:00
    如果能用 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  
       2023-06-13 09:50:12 +08:00
    @w1lu0bOo #32 可能内存管理这方面要注意,vlang 的内存管理模式在编译的时候指定,分为自动 gc ,自动插入 free ,以及手动管理。之前尝试的时候内存管理这块还没解决,不知道现在如何了,还会不会在自动 gc 或 free 时有内存泄漏的问题。
    zhyl
        42
    zhyl  
       2023-06-13 09:52:45 +08:00
    @zhyl #41 再者 vlang 现在还没有到 1.0 ,语法上也并不稳定,可能也是一个大坑
    iceheart
        43
    iceheart  
       2023-06-28 06:34:49 +08:00 via Android
    只是 libstdc++库依赖的问题?可以链接静态库版本啊。
    zzzkkk
        44
    zzzkkk  
       2023-08-12 10:27:35 +08:00
    @duke807
    大佬 做嵌入式 卖摄像头的吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3379 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 05:04 PVG 13:04 LAX 22:04 JFK 01:04
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86