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

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

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

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

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

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

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

    12 条回复    2023-09-29 10:36:24 +08:00
    yaott2020
        1
    yaott2020  
    OP
       212 天前 via Android
    大佬们轻喷,我真的不太懂 C++,有啥问题请指教。。。
    mainjzb
        2
    mainjzb  
       212 天前
    C++真的没有包管理。各大三方包管理基本都是有其中一些库。。。
    比如我用 vcpkg ,前几天想用 QHotkey 就没有。没办法只能自己编译。编译了好几次才链接成功。这类问题已经是 C++的硬伤了。你必须花费很多时间在无关编码的问题上。
    目前主流 14 17 大部分版本发布后,3 年后才会慢慢扩散到项目上。qt 目前是 17
    C++很多系统有关接口。。。事实上是 go 都有人给你擦屁股了。C++大概率你要自己擦屁股。或者找一个已经给你擦屁股了的库,又要经历一些自己编译链接失败的问题。
    能支持 cmake 的库已经是谢天谢地了。。。
    我也是菜鸡。
    ysc3839
        3
    ysc3839  
       212 天前 via Android
    2. 有大有小,像 C++14 C++17 就不太大,C++20 就很大
    3. 个人感觉不痛苦,C++20 的 STL 用起来已经挺方便的了,C++11 配合 boost 也没啥问题。
    ysc3839
        4
    ysc3839  
       212 天前 via Android
    @mainjzb Qt 只是默认旧版本吧,不是不支持旧版本,之前我用 C++20 配合第三方的 Qt 协程库,没有什么问题
    hhjuteman
        5
    hhjuteman  
       212 天前
    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  
       212 天前
    对 C++而言,cmake 是目前唯一解,目前的包管理不如 cmake 。cmake 是主流
    目前有一些人在用 zig 的包管理编译 c 的库,希望 zig 能解决包管理的问题吧。。。
    nenseso
        7
    nenseso  
       212 天前
    C++跨平台不痛苦,算是比较好的选择,其他很多新的语言支持都没有它好,但是有时候有些符号冲突问题也很难啃,算是难度和趣味并存吧
    NEO17
        8
    NEO17  
       212 天前
    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  
       212 天前
    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  
       212 天前 via Android
    @mainjzb 说错了,应该是“Qt 只是默认旧版本吧,不是不支持新版本”
    cnbatch
        11
    cnbatch  
       212 天前
    (以下描述带有我个人的使用习惯,请谨慎参考)

    包管理:

    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  
       211 天前
    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   ·   我们的愿景   ·   实用小工具   ·   2176 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 16:12 · PVG 00:12 · LAX 09:12 · JFK 12:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.