我是安卓开发,最近公司推跨平台要用 C++,请教前辈们跨平台领域如何提升 C++水平? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WhoCanBeRich
V2EX    C++

我是安卓开发,最近公司推跨平台要用 C++,请教前辈们跨平台领域如何提升 C++水平?

  •  
  •   WhoCanBeRich 2024-01-27 15:35:53 +08:00 4502 次点击
    这是一个创建于 622 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rt 先提前跪谢各位前辈们,

    我自己大学期间啃过 C++ plus ,但已经忘得差不多了。

    安卓开发我用的 Kotlin ,偶尔也会搞点 iOS 用 OC 。

    第 1 条附言    2024-01-27 22:39:46 +08:00
    其它同事在做上层 UI ,核心层统一用 C/C++来做
    25 条回复    2024-07-12 10:27:44 +08:00
    jim9606
        1
    jim9606  
       2024-01-27 18:19:50 +08:00   5
    第一次听为了跨平台用 C++的,C/C++通常是反跨平台的。
    能不能说详细点?
    roundgis
        2
    roundgis  
       2024-01-27 19:11:42 +08:00 via Android
    用就了

    多用自然就提升了
    ugpu
        3
    ugpu  
       2024-01-27 19:14:41 +08:00   1
    跨平台 c++ 有点扯蛋了。 真实目的是这样吗? 拍脑袋作出的决定吧
    DefoliationM
        4
    DefoliationM  
       2024-01-27 19:16:53 +08:00 via Android
    感觉相比 c++现在 rust 应该是更好的选择。跨平台应该要熟悉操作系统的系统接口的不同。
    okakuyang
        5
    okakuyang  
       2024-01-27 19:20:17 +08:00
    你这个不是跨平台吧,是安卓和其他端要共用一些 c 类的代码库吧?我觉得做平台端的无论是安卓还是 iOS ,深研平台端自己的生态代码就好了啦。c 类库会调用,会简单的修改就可以了。
    James369
        6
    James369  
       2024-01-27 19:33:50 +08:00
    可能其它同事在做上层 UI ,核心层统一用 C/C++来做是对的。先学会封装一个一个小模块开始,
    iOCZS
        7
    iOCZS  
       2024-01-27 19:52:18 +08:00   2
    c++98 和 c++11 、14 、17 、20 是两门语言
    kuituosi
        8
    kuituosi  
       2024-01-27 20:56:21 +08:00
    先确定 c++的版本,不同版本 c++是不同的语言
    然后就是多练习了
    ZZ74
        9
    ZZ74  
       2024-01-27 21:04:11 +08:00
    应该说的是 QT 啦
    openmynet
        10
    openmynet  
       2024-01-27 22:13:03 +08:00
    rust 跨平台会更方便一些,特别是和其他语言进行对接。
    WhoCanBeRich
        11
    WhoCanBeRich  
    OP
       2024-01-27 22:30:56 +08:00
    @James369 嗯嗯 你说的是对的
    iOCZS
        12
    iOCZS  
       2024-01-27 22:31:56 +08:00
    跨平台不应该是 flutter 吗?
    tyzandhr
        13
    tyzandhr  
       2024-01-27 22:58:07 +08:00 via Android   1
    全用标准库,链接 clang 的 libc++,不会有什么需要注意的地方。在此情况下,想要写出不垮平台的反而有些难
    araraloren
        14
    araraloren  
       2024-01-27 23:21:24 +08:00
    千万要忘记你大学学的,怎么做需要先锁定你的技术栈还有使用的版本,如果是楼上说的 QT 应该靠谱点。。。
    crayygy
        15
    crayygy  
       2024-01-27 23:44:42 +08:00   11
    第一次遇到我自己做的方向。。。聊聊我的看法吧

    首先给不太了解这个架构的朋友介绍一下,通常所谓的 跨平台 方向,指的是 UI 上的跨平台,所使用的技术栈更多的是关注于 UI 怎么绘制,比如常见的 H5(Web),RN ,Flutter ,等等, 而 C/C++ 跨平台也是非常常见的,只不过局限于某些领域,比如音视频领域,安全领域等等,主要原因有几个,一个是成本太高,单单开发人员要熟悉 C/C++ 就是个不小的挑战了,二是业务逻辑没那么复杂也不需要那么多的 Native 实现。


    我也是 Android UI 方向转下去做 C++ 跨平台开发的,C++ 虽然学校里学了一年,但 VC 6 跟现代 C++ 不说完全没关系吧,也没啥可参考的了,所以重新学习和熟练 C++ 也花费了不少时间和精力,现在也基本上熟悉这一套了。



    1. 看自己项目相关的,有没有 JNI 相关的代码,如果有手写的(非模板生成的) JNI 代码,先了解一下 JNI 相关的基础知识,比如线程模型,Java env ,基础类型的映射,如何从 Java 调用 Native ,如何从 C++ 调用 Java ,看完这部分基本上就能把 UI 和 底层 之间的数据互通弄懂个七七八八的了。

    2. 如果不需要关心 JNI (已经有模板了,或者是有其他人去做 JNI 的了),下一步就是了解项目用的 C++ 版本是多少,现代项目多数应该都是 C++ 17 了,少部分老项目可能是 C++ 14 ,再老的我感觉应该比较少了,尤其是新项目,至于 C++ 20 个人感觉不用太早了解,先了解完 C++ 14 和 C++ 17 的内容就差不多能写出能用的代码。

    3. C++ 14 可以看 C++ Primer ,C++ 17 可以看网上新版本的介绍,大多数都是为了简化写法的,看到项目里不懂的语法去搜索,然后一个个的去看,读 API 文档,推荐 https://en.cppreference.com/w/ ,啥都有,sample 也有,不懂的就查

    4. 如果是入门 C++ 还不久,想要快速了解 C++ 的基本语法,觉得 Primer 太厚了,可以看 《 Essential C++》,不厚,够用

    5. 模板是个坑,没有一定的基本功不要乱写模板代码

    6. 项目如果有 C++ Guideline 先熟读一遍,了解 Bad & Good, 尽量不要写出 Bad 的代码

    7. 现代 C++ 写起来并不是特别的麻烦,像我们项目内部就拒绝原始的指针,绝大多数都是智能指针(shared_ptr, unique_ptr, week_ptr 等等,不是 auto_ptr 这种名字叫智能实则很智障的),也不推荐写 raw array ,用的也都是 vector 等等,已经挺接近 Java 之类的了,写起来就类似这样
    ```
    const auto widget = Widget()
    ```

    8. 熟悉并弄清楚几个经常会用错的比如 const 的用法,& 的用法 等等,先 ”抄“ 别人的代码,不明白的就网上搜

    9. 如果有精力,可以搞一搞 C++ 的编译,比如 CMake (看项目用啥),以前觉得这个很难懂,照葫芦画瓢写过几次相关的优化之后觉得挺有意思的,虽然跟业务没啥关系,但对于了解整个项目的编译过程很有帮助,有利于成长(晋升)。
    WhoCanBeRich
        16
    WhoCanBeRich  
    OP
       2024-01-27 23:47:10 +08:00
    @crayygy 太感谢大佬了!受益匪浅!
    YsHaNg
        17
    YsHaNg  
       2024-01-27 23:54:21 +08:00 via iPhone
    研究一下 chromium 自己 build 一个装到 android 机上 有空试试 backport 高版本的 security fix 到低版本上 比如 104 kb 号都写在每次 release note 里 对应 commit 能找到
    786375312123
        18
    786375312123  
       2024-01-27 23:59:21 +08:00
    c++不难,搞清楚内存分配就行,现在都用智能指针,避开几个大坑就没事。
    YsHaNg
        19
    YsHaNg  
       2024-01-28 00:03:45 +08:00 via iPhone
    @crayygy 模版是现代化 cpp 的标志 还是很好用的 我刚工作接触到 interpreter 内部用的 arithmetic 模版函数的时候感觉大开眼界 还有后来 v8 引擎也有很多 读通以后豁然开朗
    Lonenso
        20
    Lonenso  
       2024-01-28 10:32:32 +08:00   2
    #15 @cayygy 说得很好了,我补充几点(之前做过相关的)。

    https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines
    https://hackingcpp.com/
    https://godbolt.org/(我很喜欢用这个,用来学习,理解程序行为非常有帮助)
    如果不需要维护项目的构建,只需要先稍微了解一下编译的流程发生了什么就行。
    https://github.com/PacktPublishing/CMake-Best-Practices (书推荐先看 1 ,2 ,3 ,12 )

    如果需要的话,那可以看看 程序员修炼之道(书名起得不好,是讲 linker 和 loader 的)

    以下 repo 会帮助用户生成跨平台的胶水代码,android 是通过 JNI 调用的,iOS 通过 OC 。
    https://github.com/dropbox/djinni ,也很容易搜到 snapchat (更多的 feature ) 和社区维护(拆分 generator 和 library ,增加更多语言的支持)的版本
    https://github.com/scapix-com/scapix ,( c++17 ,不需要用户额外生成胶水代码)
    https://github.com/heremaps/gluecodium (和 djinni 类似)

    祝好
    sakura6264
        21
    sakura6264  
       2024-01-28 15:36:43 +08:00
    我印象中 C++是跟跨平台最没关系的语言了吧
    fishily1993
        22
    fishily1993  
       2024-01-29 09:47:21 +08:00
    虽然早已换了工作,但大型 C++工程的跨平台编译至今还是我的噩梦。一想到那个 makefile 我就害怕
    yougotme
        23
    yougotme  
       2024-02-10 14:21:19 +08:00 via iPhone
    跨平台? 不是应该用 flutter 、react-native 这些吗? 难道你是跨入嵌入式平台了?
    yougotme
        24
    yougotme  
       2024-02-10 14:22:04 +08:00 via iPhone
    @fishily1993 改用 cmake 了
    A4l1CteRQHlG1Bs8
        25
    A4l1CteRQHlG1Bs8  
       2024-07-12 10:27:44 +08:00 via iPhone
    这语言理论和实践都不可缺,要不有的问题永远理解不了
    关于     帮助文档     自助推广系统     博客   API     FAQ     Solana     5794 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 33ms UTC 06:38 PVG 14:38 LAX 23:38 JFK 02:38
    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