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

2023-09-28 13:08:24 +08:00
 yaott2020

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

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

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

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

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/977893

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX