跳转至内容

现代C++ | mcpp论坛

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

47 主题 213 帖子

子版块

  • 0 赞同
    1 帖子
    489 浏览
    尚无回复
  • 0 赞同
    7 帖子
    1k 浏览
    SPeakS

    @ziyikong 今天或明天我也会再制作一个windows上练习代码环境搭建的视频细节

  • [windows系统][环境配置] d2x命令好像无法使用?

    3
    0 赞同
    3 帖子
    3 浏览
    S

    屏幕截图 2026-02-27 202741.png 问题是这个也不可用😢 😢

  • xlings安装完成,但是项目安装提示失败

    7
    0 赞同
    7 帖子
    37 浏览
    SPeakS

    @sleepyiang 找到原因, 这个时项目里d2x buildtools的bug
    现在已经修复了

    https://github.com/mcpp-community/d2mcpp/pull/40

    可以使用 d2x install d2mcpp 获取最新的项目 再尝试尝试

    注: 应该不是上面说的版本原因

  • C/C++的神奇"语法", 趋向操作 `x --> 0`

    3
    1 赞同
    3 帖子
    35 浏览
    unamed-coderU

    我怎么说没见过,原来是两个运算符的组合:-- 自减运算符和 > 大于运算符。

    先判断 x 是否大于0,若成立则 x 自减。这样 x 就会像 0 趋近,直到不大于 0。这种写法其实就是 (x--) > 0……

  • dx2命令无效

    6
    0 赞同
    6 帖子
    25 浏览
    SPeakS

    具体参考

    http://forum.d2learn.org/post/774

    e0284a32-24d0-4bd1-98a7-df45b10c84e5-image.png

  • 刚学 C++ 模块想要尝试声明与定义分离,结果失败了

    已移动
    4
    0 赞同
    4 帖子
    65 浏览
    lost-42L

    看起来像是 ConsolePrint 和 encipherment 的问题, 错误提示有找不到模块 ConsolePrint 以及 encipherment 不是个命名空间.
    我没有用过这个库, 不确定是不是需要额外配置, 可以先替换成 std::println 试试?

  • C++ 模块中静态全局变量的消失问题

    2
    1 赞同
    2 帖子
    29 浏览
    woshinideba1425W

    错误例子(我写的)

    module; #include "httplib.h" export module mcp.compat.httplib; export namespace mcp { using HttpClient = httplib::Client; using DataSink = httplib::DataSink; using Headers = httplib::Headers; using HttpRequest = httplib::Request; using HttpResponse = httplib::Response; using HttpServer = httplib::Server; #ifdef MCP_SSL using SslServer = httplib::SSLServer; #endif }

    正确例子(官方库提供的)

    module; /* * Headers */ #ifdef _WIN32 #ifndef _CRT_SECURE_NO_WARNINGS #define _CRT_SECURE_NO_WARNINGS #endif //_CRT_SECURE_NO_WARNINGS #ifndef _CRT_NONSTDC_NO_DEPRECATE #define _CRT_NONSTDC_NO_DEPRECATE #endif //_CRT_NONSTDC_NO_DEPRECATE #if defined(_MSC_VER) #if _MSC_VER < 1900 #error Sorry, Visual Studio versions prior to 2015 are not supported #endif #pragma comment(lib, "ws2_32.lib") #ifndef _SSIZE_T_DEFINED #define _SSIZE_T_DEFINED #endif #endif // _MSC_VER #ifndef S_ISREG #define S_ISREG(m) (((m) & S_IFREG) == S_IFREG) #endif // S_ISREG #ifndef S_ISDIR #define S_ISDIR(m) (((m) & S_IFDIR) == S_IFDIR) #endif // S_ISDIR #ifndef NOMINMAX #define NOMINMAX #endif // NOMINMAX #include <io.h> #include <winsock2.h> #include <ws2tcpip.h> #if defined(__has_include) #if __has_include(<afunix.h>) // afunix.h uses types declared in winsock2.h, so has to be included after it. #include <afunix.h> #define CPPHTTPLIB_HAVE_AFUNIX_H 1 #endif #endif #ifndef WSA_FLAG_NO_HANDLE_INHERIT #define WSA_FLAG_NO_HANDLE_INHERIT 0x80 #endif #else // not _WIN32 #include <arpa/inet.h> #if !defined(_AIX) && !defined(__MVS__) #include <ifaddrs.h> #endif #ifdef __MVS__ #include <strings.h> #ifndef NI_MAXHOST #define NI_MAXHOST 1025 #endif #endif #include <net/if.h> #include <netdb.h> #include <netinet/in.h> #ifdef __linux__ #include <resolv.h> #undef _res // Undefine _res macro to avoid conflicts with user code (#2278) #endif #include <csignal> #include <netinet/tcp.h> #include <poll.h> #include <pthread.h> #include <sys/mman.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> #ifndef INVALID_SOCKET #define INVALID_SOCKET (-1) #endif #endif //_WIN32 #if defined(__APPLE__) #include <TargetConditionals.h> #endif #include <algorithm> #include <array> #include <atomic> #include <cassert> #include <cctype> #include <chrono> #include <climits> #include <condition_variable> #include <cstdlib> #include <cstring> #include <errno.h> #include <exception> #include <fcntl.h> #include <functional> #include <iomanip> #include <iostream> #include <list> #include <map> #include <memory> #include <mutex> #include <random> #include <regex> #include <set> #include <sstream> #include <string> #include <sys/stat.h> #include <system_error> #include <thread> #include <unordered_map> #include <unordered_set> #include <utility> #if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \ defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) #if TARGET_OS_MAC #include <CFNetwork/CFHost.h> #include <CoreFoundation/CoreFoundation.h> #endif #endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO or // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN #ifdef CPPHTTPLIB_OPENSSL_SUPPORT #ifdef _WIN32 #include <wincrypt.h> // these are defined in wincrypt.h and it breaks compilation if BoringSSL is // used #undef X509_NAME #undef X509_CERT_PAIR #undef X509_EXTENSIONS #undef PKCS7_SIGNER_INFO #ifdef _MSC_VER #pragma comment(lib, "crypt32.lib") #endif #endif // _WIN32 #if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) #if TARGET_OS_MAC #include <Security/Security.h> #endif #endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO #include <openssl/err.h> #include <openssl/evp.h> #include <openssl/ssl.h> #include <openssl/x509v3.h> #if defined(_WIN32) && defined(OPENSSL_USE_APPLINK) #include <openssl/applink.c> #endif #include <iostream> #include <sstream> #if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER) #if OPENSSL_VERSION_NUMBER < 0x1010107f #error Please use OpenSSL or a current version of BoringSSL #endif #define SSL_get1_peer_certificate SSL_get_peer_certificate #elif OPENSSL_VERSION_NUMBER < 0x30000000L #error Sorry, OpenSSL versions prior to 3.0.0 are not supported #endif #endif // CPPHTTPLIB_OPENSSL_SUPPORT #ifdef CPPHTTPLIB_MBEDTLS_SUPPORT #include <mbedtls/ctr_drbg.h> #include <mbedtls/entropy.h> #include <mbedtls/error.h> #include <mbedtls/md5.h> #include <mbedtls/net_sockets.h> #include <mbedtls/oid.h> #include <mbedtls/pk.h> #include <mbedtls/sha1.h> #include <mbedtls/sha256.h> #include <mbedtls/sha512.h> #include <mbedtls/ssl.h> #include <mbedtls/x509_crt.h> #ifdef _WIN32 #include <wincrypt.h> #ifdef _MSC_VER #pragma comment(lib, "crypt32.lib") #endif #endif // _WIN32 #if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) #if TARGET_OS_MAC #include <Security/Security.h> #endif #endif // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN // Mbed TLS 3.x API compatibility #if MBEDTLS_VERSION_MAJOR >= 3 #define CPPHTTPLIB_MBEDTLS_V3 #endif #endif // CPPHTTPLIB_MBEDTLS_SUPPORT // Define CPPHTTPLIB_SSL_ENABLED if any SSL backend is available // This simplifies conditional compilation when adding new backends (e.g., // wolfSSL) #if defined(CPPHTTPLIB_OPENSSL_SUPPORT) || defined(CPPHTTPLIB_MBEDTLS_SUPPORT) #define CPPHTTPLIB_SSL_ENABLED #endif #ifdef CPPHTTPLIB_ZLIB_SUPPORT #include <zlib.h> #endif #ifdef CPPHTTPLIB_BROTLI_SUPPORT #include <brotli/decode.h> #include <brotli/encode.h> #endif #ifdef CPPHTTPLIB_ZSTD_SUPPORT #include <zstd.h> #endif export module httplib; export extern "C++" { #include "httplib.h" }

    当你试图将一个非模块化的第三方库(尤其是像 httplib 这种带全局状态或初始化逻辑的库)封装进模块时:

    不要尝试只导出部分类型:除非你非常确定该库没有全局初始化逻辑(Constructor static guards)。

    使用 export extern "C++":这是将传统头文件“模块化”的最标准、最稳妥做法。

    环境对齐:在 module; 之后,务必把该库依赖的所有系统宏(如 _WIN32, WIN32_LEAN_AND_MEAN 等)都写清楚。

  • mcpp在远程连接ubuntu的vscode中使用d2x checker命令,编辑器无法识别代码

    已锁定 已解决
    4
    0 赞同
    4 帖子
    72 浏览
    fillSeaF

    @sunrisepeak 解决了👍

  • 【C++11】异步操作

    2
    1 赞同
    2 帖子
    79 浏览
    SPeakS

    总结很好

  • C++ 包管理器选哪个?

    已移动
    5
    0 赞同
    5 帖子
    99 浏览
    NekoycodeN

    除了vcpkg 和 xmake(xrepo) 的话, conan 比较受欢迎

  • MC++编码风格探讨 - 标识符命名风格

    6
    1 赞同
    6 帖子
    142 浏览
    sunrisepeakS

    @SkyWingF 后面给项目增加一个 类似 "最佳实践" 章节总结这些:

    类型别名用using 代替 typedef 引用的使用 尽量少使用宏 非必要不使用 属性标识 [[nodiscard]], [[deprecated]] ...
  • 1 赞同
    3 帖子
    146 浏览
    sunrisepeakS

    @Phtato 目前默认是模块化的写法, 20之前的话 可以参考 google-style/cpp

    社区有个主要的任务的推模块化库和相关工具链使用和普及

  • 0 赞同
    3 帖子
    131 浏览
    sunrisepeakS

    最新版本该问题已经解决

    获取d2mcpp最新代码 更新d2x到最新版本 xim --update index xlings update d2x
  • 关于学习C++中的int main中new一个新的伐对象的困惑

    已锁定 已解决
    3
    0 赞同
    3 帖子
    84 浏览
    g202080272G

    @sunrisepeak 谢谢。我已经理解了

  • 1 赞同
    1 帖子
    73 浏览
    尚无回复
  • 讨论: 现代C++编码/项目风格

    1
    1 赞同
    1 帖子
    99 浏览
    尚无回复
  • 0 赞同
    7 帖子
    361 浏览
    sunrisepeakS

    @Saaqq 目前d2x工具使用c++重构了, 可以更新一下 应该不会有这个问题了

    先更新一下d2x工具

    xlings self update xim --update index xlings update d2x

    然后再到项目目录运行下面命令进入练习模式

    d2x checker

    注: 最新版本的d2x也支持配置AI大模型做智能引导, 也可以玩一玩

    33e4df78-8646-4b89-847f-41899668b251-image.png

    移植后的d2x仓库: https://github.com/d2learn/d2x 交互式教程说明: https://d2learn.github.io/d2x-project-template/chapter_0.html
  • C++学习资料开源

    1
    2 赞同
    1 帖子
    210 浏览
    尚无回复
  • 1 赞同
    6 帖子
    212 浏览
    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。后续建议扯不出来了