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

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

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

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

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

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

    第 1 条附言  ·  325 天前
    其它同事在做上层 UI ,核心层统一用 C/C++来做
    25 条回复    2024-07-12 10:27:44 +08:00
    jim9606
        1
    jim9606  
       326 天前   ❤️ 5
    第一次听为了跨平台用 C++的,C/C++通常是反跨平台的。
    能不能说详细点?
    roundgis
        2
    roundgis  
       326 天前 via Android
    用就對了

    多用自然就提升了
    ugpu
        3
    ugpu  
       326 天前   ❤️ 1
    跨平台 c++ 有点扯蛋了。 真实目的是这样吗? 拍脑袋作出的决定吧
    DefoliationM
        4
    DefoliationM  
       326 天前 via Android
    感觉相比 c++现在 rust 应该是更好的选择。跨平台应该要熟悉操作系统的系统接口的不同。
    okakuyang
        5
    okakuyang  
       326 天前
    你这个不是跨平台吧,是安卓和其他端要共用一些 c 类的代码库吧?我觉得做平台端的无论是安卓还是 iOS ,深研平台端自己的生态代码就好了啦。c 类库会调用,会简单的修改就可以了。
    James369
        6
    James369  
       325 天前
    可能其它同事在做上层 UI ,核心层统一用 C/C++来做是对的。先学会封装一个一个小模块开始,
    iOCZS
        7
    iOCZS  
       325 天前   ❤️ 2
    c++98 和 c++11 、14 、17 、20 是两门语言
    kuituosi
        8
    kuituosi  
       325 天前
    先确定 c++的版本,不同版本 c++是不同的语言
    然后就是多练习了
    ZZ74
        9
    ZZ74  
       325 天前
    应该说的是 QT 啦
    openmynet
        10
    openmynet  
       325 天前
    rust 跨平台会更方便一些,特别是和其他语言进行对接。
    WhoCanBeRich
        11
    WhoCanBeRich  
    OP
       325 天前
    @James369 嗯嗯 你说的是对的
    iOCZS
        12
    iOCZS  
       325 天前
    跨平台不应该是 flutter 吗?
    tyzandhr
        13
    tyzandhr  
       325 天前 via Android   ❤️ 1
    全用标准库,链接 clang 的 libc++,不会有什么需要注意的地方。在此情况下,想要写出不垮平台的反而有些难
    araraloren
        14
    araraloren  
       325 天前
    千万要忘记你大学学的,怎么做需要先锁定你的技术栈还有使用的版本,如果是楼上说的 QT 应该靠谱点。。。
    crayygy
        15
    crayygy  
       325 天前   ❤️ 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
       325 天前
    @crayygy 太感谢大佬了!受益匪浅!
    YsHaNg
        17
    YsHaNg  
       325 天前 via iPhone
    研究一下 chromium 自己 build 一个装到 android 机上 有空试试 backport 高版本的 security fix 到低版本上 比如 104 kb 号都写在每次 release note 里 对应 commit 能找到
    786375312123
        18
    786375312123  
       325 天前
    c++不难,搞清楚内存分配就行,现在都用智能指针,避开几个大坑就没事。
    YsHaNg
        19
    YsHaNg  
       325 天前 via iPhone
    @crayygy 模版是现代化 cpp 的标志 还是很好用的 我刚工作接触到 interpreter 内部用的 arithmetic 模版函数的时候感觉大开眼界 还有后来 v8 引擎也有很多 读通以后豁然开朗
    Lonenso
        20
    Lonenso  
       325 天前   ❤️ 2
    #15 @crayygy 说得很好了,我补充几点(之前做过相关的)。

    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  
       325 天前
    我印象中 C++是跟跨平台最没关系的语言了吧
    fishily1993
        22
    fishily1993  
       324 天前
    虽然早已换了工作,但大型 C++工程的跨平台编译至今还是我的噩梦。一想到那个 makefile 我就害怕😨
    yougotme
        23
    yougotme  
       312 天前 via iPhone
    跨平台? 不是应该用 flutter 、react-native 这些吗? 难道你是跨入嵌入式平台了?
    yougotme
        24
    yougotme  
       312 天前 via iPhone
    @fishily1993 改用 cmake 了
    A4l1CteRQHlG1Bs8
        25
    A4l1CteRQHlG1Bs8  
       159 天前 via iPhone
    这语言理论和实践都不可缺,要不有的问题永远理解不了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3331 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 11:28 · PVG 19:28 · LAX 03:28 · JFK 06:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.