跳转至内容

现代C++ | mcpp论坛

现代C++爱好者论坛 - 官网 | 开源

49 主题 221 帖子

子版块

  • C++学习资料开源

    1
    2 赞同
    1 帖子
    260 浏览
    尚无回复
  • 1 赞同
    6 帖子
    326 浏览
    dustchensD

    感觉学习最难的地方就是内容太分散了,而且夹杂了很多和语言本身不相关的内容,可以说相关也可以说不相关,我的用词不一定准确。

    如果只限定C++20以上版本。完全用模块,且限定一种编译器,使用cmake,那入门的难度会降不少,但是中间还是有鸿沟,如果不能完全理解其中的历史包袱,还有大量使用,会非常难学。

    拿教培最成功的Java来说,初期学习很大程度是倾向于了解语言本身语法,还有一些实现特性,比如各种容器怎么用,特性背后是什么原理,IDEA一开,按钮点一点就可以了,并且出现问题也很容易定位错误,反正大伙都是随地大小抛异常的,叫什么名一清二楚。再深入一点,要学习各种轮子是怎么写的,ctrl按住鼠标点一点就跳进了源代码,源码非常清晰,顶多长了一点复杂了一点,抄也很容易抄明白。到了深入学习的时候,开始学习项目框架,多线程这些,再引入三方库,基本上很容易操作。最后的最后,哪怕学习不明白,了解的不够深入,也有spring这样的大杀器,它的原理很复杂,但是使用却很简单不同层级上@几下,很快就能搭建一个破烂项目,虽然很破烂,但是它跟高级项目是同一个东西,恭喜你,没有入门也半只脚踏进去了。

    但是C++不一样,一起跟它出现的是C,那就引出了无数的历史包袱,想要入门,门在哪里就成了一个问题,门在水面下,很多东西是以思想的形式存在的,并且一些新特性,本身就是散开的,都是为了解决之前分散在不同方面的问题,学了知道了但是不知道在哪串起来。
    第一个要学的就是内存管理的思想,为什么说是思想,而不是方法。我认为编程语言就是一步步抽象的过程,为什么要抽象,是因为要实现功能,很多写C的老保觉得底层更高级,以至于衍生出多汇编吹,不是这样的,计算机最终目的是实现人想要实现的东西,这个实现才是有意义的,编程语言实现的是语义,语义经过计算机执行得到结果,语义是我们书写最重要的东西。用什么汇编实现,底层到底怎么样,是次要矛盾!如果它是主要矛盾,那么大伙都应该在用 0 1实现语义才对,哪轮得到汇编,正因如此,表达语义更简单的汇编取代了打纸带写01,高级语言用更方便的语义表达让程序员能更好工作,AI也提供了用自然语言表达语义得到计算结果的能力。只不过我们这个领域大部分功能还是需要我们用编程语言实现语义,得到结果,或许几百年后编程可以用自然语言,直接通过更高级的编译器翻译成C++或者其他语言再变成机器码实现语义,得到程序。
    扯远了。。。。内存管理是一种思想,因此用虚拟机管理内存和手动管理内存,并没有本质的区别,只是实现不同,效果有略微差别罢了。C++处于一种半自动管理的状态,这个半自动是指相比于纯C,语言本身的机制自动帮你实现了部分管理内存的语义,RAII的思想就是这个半自动的衍生品。内存管理这部分要让新手能入门,就不能只讲构造析构,还有智能指针这些,而是要给出对应C语言在原始手动状态,是如何实现的,这样才能完全明白原理。
    就比如智能指针,它实现内存管理是借助了析构函数这个能在离开作用域自动调用的特性,相同的C语言代码,要借助一系列黑魔法才能实现同样的语义,给出这些代码有了对比就能更好讲解,让大伙知其所以然。
    再比如各种vector轮子的讲解,初学的时候一头雾水,为什么要用什么allocate和定位new,这时候把C实现new的代码贴出来,(先申请个空间,强转一下;对不同类型赋值,有的还需要再申请资源)这就又把new和delete是两件事的知识点再串起来了,然后又能引出这样拆分的好处:预先分配大块内存,定位new可以在指定位置用构造函数赋值。而主动调用析构,也就是通知房子空了,里面可能存在的资源也清理了。如果不拆分,那调用delete,就会把大块内存中间删掉一个内存,释放给操作系统,还要维护断开不连续的两个内存。如果项目能以一种思想的实现串连起分散的内容,或者按片划分,那对于学习真的很有帮助。

    然后就是各种历史遗留问题,enum、头文件本质是复制粘贴,其实就是那时候编译器不太智能硬件各种受限,导致后续一系列。。。。然后还要讲几个编译器,cmake,包管理,这些感觉都不是语言本身要学习的,而是历史遗留不得不学,讲解cmake这些东西,那就要对比着来,比如在vs里添加各种链接,才能体现有这么个配置文本的好处。扯不出来了,总之这些历史遗留和基础设施,弗如rust。后续建议扯不出来了

  • Linux系统编程(2)文件IO

    3
    1 赞同
    3 帖子
    138 浏览

    @sunrisepeak 在 Linux系统编程(2)文件IO 中说:

    感觉可以把这个系列整理成一个GitHub 仓库 包含文档和对应的练习或演示代码
    让读者上手实操/改改东西 用 strace 等一些工具 追一追 系统调用 观察真实机器上的效果 之类的
    体验感应该能增强不少

    时间比较少,有空可以整理一下

  • llmapi项目在使用xmake构建时无法找到std.cc

    已锁定 已解决
    5
    0 赞同
    5 帖子
    207 浏览
    sunrisepeakS

    llmapi 和 xlings 都算是初期项目, 有什么问题或想法都可以反馈到项目issue里

  • Linux系统编程(3)文件读写操作

    1
    0 赞同
    1 帖子
    69 浏览
    尚无回复
  • Linux系统编程(1)文件

    1
    1 赞同
    1 帖子
    67 浏览
    尚无回复
  • 0 赞同
    8 帖子
    333 浏览

    @FrozenLemonTee 在 C++中的initializer_list获取列表长度并用于模板参数的编译期计算小示例 中说:

    clang最小可编译的版本和标准是clang3.4.1+cpp11:

    image.png

    这样

  • 0 赞同
    3 帖子
    372 浏览
    maomao725M

    我的解决办法 将代理设为全局代理 开启tune模式 就行啦,我关代理会显示无法抵达服务器,如果单纯规则代理又会git不到

  • xlings安装问题

    4
    0 赞同
    4 帖子
    238 浏览
    SPeakS

    @xuxubaobao 按下面尝试删除旧版本xlings 然后重新安装,
    把安装过程的log贴一下 我分析下什么原因

    http://forum.d2learn.org/post/663
  • 问问大家写CPP项目使用的规范

    已移动
    2
    0 赞同
    2 帖子
    222 浏览
    SPeakS

    如果作为一个库设计者的话, 感觉总体遵守

    接口易用性优先 (底层实现可以复杂, 但接口要尽可能的易用和理解 区分内部接口和外部接口, 最小集合暴露给使用者

    谷歌有个C++风格指导: https://google.github.io/styleguide/cppguide.html

    在了解到一个项目如何架构和设计后, 又要回到现实 - 根据当下情况和目标, 对项目做出合适的架构, 而不要过渡设计, 因为每个项目都有他发展的时间段, 每个时期, 目标不同

    例如: 对于要快速能用或上线的MVP, 目标是能用就行, 反而没有太多设计就是好的设计

  • 0 赞同
    4 帖子
    261 浏览
    dhloloD

    收到,感谢👍

  • 0 赞同
    19 帖子
    649 浏览
    SPeakS

    补充: 检测终端没有实时更新问题解决方法

    方法1: 修改代码后手动(ctrl + s)保存文件, 检测程序即可自动检测到 方法2: 设置vscode自动保

    image.png

  • 1 赞同
    2 帖子
    276 浏览
    SPeakS

    这里decltype 对结构化绑定的别名有个特殊处理 返回的 引用类型 是结构化绑定中特殊定义的, 不是传统认为的 引用类型, 指的是成员的声明类型, 除非成员是 T & 才会返回 T &

    image.png

    https://en.cppreference.com/w/cpp/language/decltype.html

    image.png

    https://en.cppreference.com/w/cpp/language/structured_binding.html
  • 0 赞同
    8 帖子
    336 浏览
    JFH-CAEJ

    @SPeak 在 求助 g++15.1使用std::execution对标准库算法加速遇到的问题 - 引入TBB头文件报错 中说:

    如果只是使用C++23, 不一定要使用import std/模块特性 (tbb目前本身没有支持/适配

    谢谢回复,我大概是明白了,看起来错误似乎来源于同时#include 标准库头文件,和import std; 而TBB库中会引入标准库的头文件。

  • 关于qt中Qt::WA_TranslucentBackground导致sdl无法渲染的问题

    已移动
    7
    0 赞同
    7 帖子
    324 浏览
    hammerersH

    @SPeak ,是的,只要设置了这个透明窗口就无法渲染

  • json库的initializer_list创建问题

    已锁定 已移动 已解决
    5
    0 赞同
    5 帖子
    375 浏览
    dustchensD

    @SPeak
    按照这个思路,只保留一个列表初始化,用了一个辅助函数检测了每个元素是否是数组,如果是数组就检测长度是否是2,然后首元素是否是string,如果初始化列表里全部元素都符合就判定为object。这个代码运行成功了,感谢大佬

    Json(std::initializer_list<Json> init) { if (is_object_list(init)) { JsonObject dict; for (const auto &el : init) { auto pair = std::get_if<JsonArray>(&el.m_value); // 必须是长度为2的数组 assert(pair && pair->size() == 2); auto key = std::get_if<std::string>(&(*pair)[0].m_value); // 第一个元素必须是字符串 assert(key); dict.emplace(*key, (*pair)[1]); } m_value = std::move(dict); } else { m_value = JsonArray(init); } } bool is_object_list(std::initializer_list<Json> init) { return std::all_of(init.begin(), init.end(), [](const Json &el) { auto pair = std::get_if<JsonArray>(&el.m_value); if (!pair || pair->size() != 2) return false; return std::holds_alternative<std::string>((*pair)[0].m_value); }); }
  • hello-mcpp中编译报错'auto' not allowed in function return type

    已锁定 已解决
    5
    0 赞同
    5 帖子
    387 浏览
    SPeakS

    刚刚更新优化了一下工具在macos平台上的控制台刷新机制

    如果macos上遇到控制台的输出不刷新或重复输出问题, 可以运行下面命令进行更新一下工具(默认只会覆盖xlings的核心代码, 不用但心之前的安装或配置的环境和数据缓存

    curl -fsSL https://d2learn.org/xlings-install.sh | bash
  • [项目更新 | 2025/7/21]: 增加了同步最新练习代码的功能

    1
    0 赞同
    1 帖子
    211 浏览
    尚无回复
  • 在msys2g++编译器环境下的提问 - toolchain not found!! - wsl + vscode

    已锁定 已解决
    15
    0 赞同
    15 帖子
    706 浏览
    SPeakS

    补充: 如果本地确实已经有c++环境, 但识别不到, 可以用下面命令清理以下缓存后再尝试

    xlings self clean
  • 0 赞同
    3 帖子
    318 浏览
    sunrisepeakS

    命令行可以运行xim命令试一试, 能能不能看到帮助信息, 以及试一试xvm list x命令输出的内容也贴一下