请教各位关于 C++的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yaott2020
V2EX    C++

请教各位关于 C++的问题

  •  
  •   yaott2020 2023-09-28 13:08:24 +08:00 via Android 2469 次点击
    这是一个创建于 809 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本科学过一点 C++,但也仅限于基本语法,class 虚函数之类的(印象中隐约记得)。后来就完全没有动过了。但是刚刚看了 v2 的一篇帖子,顿时引起了兴趣。

    1. C++ 有啥好用的包管理吗?我之前学过一点 Rust 就是因为 C++ 似乎(?)没有好用的包管理(本科可能只是入门太浅没讲到,或许是我忘记了?)

    2. C++ 每个版本变化都很大吗?应该怎么选择版本入手?

    3. 跨平台写起来痛苦吗?(看起来 Golang 跨平台做的不错)

    12 条回复    2023-09-29 10:36:24 +08:00
    yaott2020
        1
    yaott2020  
    OP
       2023-09-28 13:09:06 +08:00 via Android
    大佬们轻喷,我真的不太懂 C++,有啥问题请指教。。。
    mainjzb
        2
    mainjzb  
       2023-09-28 13:21:27 +08:00
    C++真的没有包管理。各大三方包管理基本都是有其中一些库。。。
    比如我用 vcpkg ,前几天想用 QHotkey 就没有。没办法只能自己编译。编译了好几次才链接成功。这类问题已经是 C++的硬伤了。你必须花费很多时间在无关编码的问题上。
    目前主流 14 17 大部分版本发布后,3 年后才会慢慢扩散到项目上。qt 目前是 17
    C++很多系统有关接口。。。事实上是 go 都有人给你擦屁股了。C++大概率你要自己擦屁股。或者找一个已经给你擦屁股了的库,又要经历一些自己编译链接失败的问题。
    能支持 cmake 的库已经是谢天谢地了。。。
    我也是菜鸡。
    ysc3839
        3
    ysc3839  
       2023-09-28 13:24:05 +08:00 via Android
    2. 有大有小,像 C++14 C++17 就不太大,C++20 就很大
    3. 个人感觉不痛苦,C++20 的 STL 用起来已经挺方便的了,C++11 配合 boost 也没啥问题。
    ysc3839
        4
    ysc3839  
       2023-09-28 13:25:22 +08:00 via Android
    @mainjzb Qt 只是默认旧版本吧,不是不支持旧版本,之前我用 C++20 配合第三方的 Qt 协程库,没有什么问题
    hhjuteman
        5
    hhjuteman  
       2023-09-28 13:26:13 +08:00
    1. vcpkg or conan, 就算有包管理器很多项目也是 compile from source ,好控制参数,有问题随时改,或者是自己套 conan 或者 vcpkg 的服务自建。或者用 cmake ,脚本小源码模块写好参数自己编。我现在公司的项目就是 cmake + python 管理的流程,说白了就是 cmake+脚本。方法很多,不统一,属于是八仙过海各显神通了。
    2. 版本向下兼容,一般一个标准出来 5 年左右基本所有主流的编译器会完全支持该标准,这个时候我就推荐你完全掌握这个标准了。比如 2022 年要掌握 c++17 ,2025 掌握 c++ 20 。版本变化有时很大,有时很小,需要自己关注。
    3. 跨平台不碰图形很好跨,涉及到图形相关就很难受。即使是 QT 这种,到了 Linux 上面也得考虑 x11 ,Wayland 。Mac 端要考虑 QT 版本和 Mac 版本的兼容性。3D 图形可以用 OpenGL 和 Vulkan ,但是还是一样涉及到窗口管理器等蛋疼的内容。 没有 GUI 的也不需要跨,只做 Unix 兼容,windows 想跑开 docker 或者 wsl 跑。很多库都是跨平台的,如果整个项目引用的都是跨平台的库,标准库等等,那么工作就比较好做。
    mainjzb
        6
    mainjzb  
       2023-09-28 13:28:58 +08:00
    对 C++而言,cmake 是目前唯一解,目前的包管理不如 cmake 。cmake 是主流
    目前有一些人在用 zig 的包管理编译 c 的库,希望 zig 能解决包管理的问题吧。。。
    nenseso
        7
    nenseso  
       2023-09-28 14:19:26 +08:00
    C++跨平台不痛苦,算是比较好的选择,其他很多新的语言支持都没有它好,但是有时候有些符号冲突问题也很难啃,算是难度和趣味并存吧
    NEO17
        8
    NEO17  
       2023-09-28 14:30:56 +08:00
    1.没啥好用的包管理,vcpkg 凑合用,有时拉取公网资源很麻烦,毕竟 build 环境可能会多种多样,最好还是源码管理,cmake 统一构建。
    2.大致是 C++98,C++11, C++14, C++17,C++20... C++98 是第一个 C++ ISO ,但 C++98 之前已经大量使用;从 C++11 开始进入 Modern C++; C++14 是对 C++11 的完善,C++17 计划是大更新,实际都是很多小更新; C++20 可能是新的 C++11 。
    3. C++ 跨平台痛不痛苦和代码库中老 C++ 代码多不多有关,往往是依赖一堆老的 C++ 代码、融合多个版本的 C++ 导致跨平台有很大包袱,如果都是现代 C++、版本一致,较少的三方库,利用 CMake C++ 跨平台还是很好搞的。
    antonius
        9
    antonius  
       2023-09-28 14:57:22 +08:00
    1. C++ 有啥好用的包管理吗?
    有,vcpkg 。我个人习惯用自己管理,然后用 cmake 构建,复杂了点,但是没什么外部依赖。

    构建系统一般用 cmake ,也有[xmake]( https://xmake.io/#/),[GENie]( https://github.com/bkaradzic/GENie),[fips]( https://github.com/floooh/fips)。

    2. C++ 每个版本变化都很大吗?应该怎么选择版本入手?
    相比 C 来说,变化比较多。为了兼容性起见可以选择 C++11 或者 C++14 ,我个人更倾向于[Orthodox C++]( https://gist.github.com/bkaradzic/2e39896bc7d8c34e042b),在可读性和性能上保持一个平衡。

    3. 跨平台写起来痛苦吗?
    还好,涉及到跨平台的有:文件系统,图形以及系统 GUI 。不过也有相关的开源解决方案,比如 SDL2 、GLFW 等等。
    ysc3839
        10
    ysc3839  
       2023-09-28 15:23:53 +08:00 via Android
    @mainjzb 说错了,应该是“Qt 只是默认旧版本吧,不是不支持新版本”
    cnbatch
        11
    cnbatch  
       2023-09-28 17:00:40 +08:00
    (以下描述带有我个人的使用习惯,请谨慎参考)

    包管理:

    Windows 用 vcpkg
    FreeBSD 用系统自带管理器
    Linux 尽量用系统自带管理器,实在没办法了才用 vcpkg


    C++版本:

    部份版本变化还是很大的,按分组来算(以下是我个人划分),那就是
    第一组 C++98 、C++03
    第二组 C++11/14/17
    第三组 C++20/23
    每一组内部的变化不算特别大,很容易平滑升级;组与组之间的变化比较大,可以当成新语言来学习


    跨平台:

    只要不是涉及到驱动层面、调用系统专属 API 的话,大多数纯命令行工具的跨平台不算痛苦,因为有不少第三方库包装得比较好,把平台差异抹平了

    图形界面程序比较麻烦,主要是因为 Linux 割裂但又不完全割裂。如果不考虑 Linux ,只考虑 Windows 、BSD ,那就会轻松很多。Windows 不用多说,可以直接静态编译出单个 exe 到处用。BSD 也类似,静态编译出来后,同系列上下游都能用。同系列上下游是指 FreeBSD → GhostBSD 这种上下游衍生关系,不是 FreeBSD→NetBSD 这种的跨系列。
    (此处只针对单纯的 GUI 界面程序,不涉及游戏 3D 绘图)
    standchan
        12
    standchan  
       2023-09-29 10:36:24 +08:00
    op 提到了 c++和 go ,作为一个 c++转 go 那我应该可以说两句。
    1 、以前写 linux c++的时候团队没有用什么包管理,一般都是自己手动变一(很蛋疼
    2 、关于 c++的版本,貌似基金会加入挺多的特性的吧,但是目前还是 c++11 比较多,参考招聘要求一般都是 c++11 。这点跟 java 有点像,jdk 都已经 21 了,国内还是守着 8 不松手
    3 、c++压根就不是跨平台的呀,写起来自然痛苦。有很多都要实际去编译,但是现在也可以用容器化去规避?
    最后,我转了 go 。团队经过考虑调研之后决定把除了音视频相关的业务都转向了 go ,方便快捷静态编译,云原生友好,高并发加 gc ,总结就是四个字 爱不释手。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5395 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 01:33 PVG 09:33 LAX 17:33 JFK 20:33
    Do have faith in what you're doing.
    ubao msn 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