<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[现代C++ | mcpp论坛]]></title><description><![CDATA[现代C++爱好者论坛 - [官网](https:&#x2F;&#x2F;mcpp.d2learn.org) | [开源](https:&#x2F;&#x2F;github.com&#x2F;mcpp-community)]]></description><link>http://forum.d2learn.org/category/20</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 22:08:23 GMT</lastBuildDate><atom:link href="http://forum.d2learn.org/category/20.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 05 Jul 2026 15:01:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[想请教一下大家构建C++模块架构是这样的吗？]]></title><description><![CDATA[<p dir="auto">@小明 后面有计划支持 msvc</p>
]]></description><link>http://forum.d2learn.org/topic/224/想请教一下大家构建c-模块架构是这样的吗</link><guid isPermaLink="true">http://forum.d2learn.org/topic/224/想请教一下大家构建c-模块架构是这样的吗</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Sun, 05 Jul 2026 15:01:19 GMT</pubDate></item><item><title><![CDATA[[mcpp]: 用 C++23 模块 + import std 开发了个构建工具，并实现自己构建自己(自举)]]></title><description><![CDATA[<p dir="auto">从去年 gcc 15.1 初步支持 import std 开始, 我就在 C++的模块化上做了很多实践</p>
<p dir="auto">前段时间, 突然产生了以 C++23 模块化为基础, <strong>实现一个现代 C++模块化项目的构建工具</strong>。并以其能用自己从源码构建出自己也就是所谓的<strong>自举来做为初步目标</strong>, 目前这个目标已经实现</p>
<p dir="auto">欢迎对现代 C++和模块化感兴趣的朋友来用, mcpp 构建工具使用模块化特性 玩一玩或开发开发小项目 也欢迎大家来反馈和交流</p>
<p dir="auto"><strong>开源仓库:</strong> <a href="https://github.com/mcpp-community/mcpp" rel="nofollow ugc">https://github.com/mcpp-community/mcpp</a></p>
<hr />
<h1>mcpp</h1>
<blockquote>
<p dir="auto">一个 现代 C++ 模块化构建工具 — 纯 C++23 模块编写，已实现自举</p>
</blockquote>
<h2>核心特性</h2>
<ul>
<li><strong>C++23 模块原生支持</strong> — <code>import std</code> 自动处理，文件级增量构建，模块依赖自动分析，零手动配置</li>
<li><strong>纯模块化自举</strong> — mcpp 自身由 43+ 个 C++23 模块组成，用自己构建自己，模块系统经实战验证</li>
<li><strong>开箱即用</strong> — 一条命令安装，内置 GCC 16 / LLVM 20 工具链，自动下载到隔离沙盒，不污染系统</li>
<li><strong>集成依赖管理</strong> — SemVer 约束解析、锁文件、跨项目 BMI 缓存、自定义包索引</li>
<li><strong>多包工作空间</strong> — Workspace 统一锁文件与版本管理，适合大型项目</li>
</ul>
<h2>为什么选择 mcpp ?</h2>
<p dir="auto">mcpp 专门为 <strong>C++23 模块化开发</strong> 打造。如果你想在项目中使用 <code>import std</code>、模块接口单元（<code>.cppm</code>）、模块分区等现代 C++ 特性，mcpp 在 Linux 上能为你提供便捷且友好的开发体验：</p>
<ul>
<li><strong>默认模块化</strong> — <code>mcpp new</code> 创建的项目模板直接使用 C++23 模块，<code>import std</code> 开箱即用</li>
<li><strong>文件级增量构建</strong> — 基于 P1689 dyndep 的三层优化（前端脏检查 + 逐文件扫描 + BMI restat ），只重编真正变化的模块</li>
<li><strong>一键创建 &amp; 构建</strong> — <code>mcpp new hello &amp;&amp; cd hello &amp;&amp; mcpp build</code>，工具链自动安装，无需手动配置编译器和构建系统</li>
<li><strong>模块化生态</strong> — <a href="https://github.com/mcpplibs" rel="nofollow ugc">mcpplibs</a> 提供一系列可直接 <code>import</code> 的 C++ 模块化库，支持自定义包索引</li>
</ul>
<blockquote>
<p dir="auto">注: <strong>早期版本</strong> — mcpp 仍在积极开发中，接口和行为可能在后续版本调整。<br />
欢迎对现代 C++ 模块化构建工具感兴趣的开发者<a href="#%E5%8F%82%E4%B8%8E%E8%B4%A1%E7%8C%AE">参与贡献</a>。<br />
问题 / 反馈 / 想法欢迎在 <a href="https://github.com/mcpp-community/mcpp/issues" rel="nofollow ugc">issues</a> 留言。</p>
</blockquote>
<h2>快速开始</h2>
<h3>安装</h3>
<p dir="auto"><strong>方式一：使用 xlings 安装（推荐）</strong></p>
<pre><code class="language-bash">xlings install mcpp -y
</code></pre>
<p dir="auto"><strong>方式二：一键安装脚本</strong></p>
<pre><code class="language-bash">curl -fsSL https://github.com/mcpp-community/mcpp/releases/latest/download/install.sh | bash
</code></pre>
<p dir="auto">安装到 <code>~/.mcpp/</code>，自动加进 shell PATH 。删除 <code>~/.mcpp</code> 即可干净卸载。</p>
<p dir="auto"><strong>方式三：让 AI 助手帮你安装</strong></p>
<p dir="auto">将以下提示词复制给你的 AI 编码助手（ Claude Code / Cursor / Copilot 等）：</p>
<pre><code>阅读 https://github.com/mcpp-community/mcpp 的 README ，
帮我安装 mcpp 并创建一个 C++23 模块项目，构建并运行。
项目的 .agents/skills/mcpp-usage/SKILL.md 有详细的使用指南。
</code></pre>
<h3>创建项目 &amp; 构建运行</h3>
<pre><code class="language-bash">mcpp new hello
cd hello
mcpp build
mcpp run
</code></pre>
<blockquote>
<p dir="auto">注：首次构建会初始化环境并获取工具链，可能需要一些时间。</p>
</blockquote>
<h3>项目结构</h3>
<pre><code>hello/
├── mcpp.toml             ← 工程描述
└── src/
    └── main.cpp          ← import std; 直接可用
</code></pre>
<pre><code class="language-toml"># mcpp.toml
[package]
name = "hello"

[targets.hello]
kind = "bin"
main = "src/main.cpp"
</code></pre>
<h3>使用模块化库</h3>
<p dir="auto">在 <code>mcpp.toml</code> 中添加两行依赖，即可引用 <a href="https://github.com/mcpplibs" rel="nofollow ugc">mcpplibs</a> 社区模块化库：</p>
<pre><code class="language-toml">[dependencies]
cmdline = "0.0.2"
</code></pre>
<p dir="auto">然后在代码中直接 <code>import</code>：</p>
<pre><code class="language-cpp">import mcpplibs.cmdline;
</code></pre>
<blockquote>
<p dir="auto">更多依赖配置方式（版本约束、命名空间、Git 引用、本地路径等）参见 <a href="docs/05-mcpp-toml.md">mcpp.toml 指南 — 依赖管理</a>。</p>
</blockquote>
<h2>平台支持</h2>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>OS / arch</th>
<th style="text-align:center">GCC (glibc)</th>
<th style="text-align:center">GCC (musl)</th>
<th style="text-align:center">Clang / LLVM</th>
<th style="text-align:center">MSVC</th>
</tr>
</thead>
<tbody>
<tr>
<td>Linux x86_64</td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title=":white_check_mark:" alt="✅" /></td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title=":white_check_mark:" alt="✅" /> <em>默认</em></td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title=":white_check_mark:" alt="✅" /></td>
<td style="text-align:center">—</td>
</tr>
<tr>
<td>Linux aarch64</td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /></td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /></td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /></td>
<td style="text-align:center">—</td>
</tr>
<tr>
<td>macOS</td>
<td style="text-align:center">—</td>
<td style="text-align:center">—</td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /></td>
<td style="text-align:center">—</td>
</tr>
<tr>
<td>Windows</td>
<td style="text-align:center">—</td>
<td style="text-align:center">—</td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /></td>
<td style="text-align:center"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /></td>
</tr>
</tbody>
</table>
<p dir="auto"><img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/2705.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--white_check_mark" style="height:23px;width:auto;vertical-align:middle" title=":white_check_mark:" alt="✅" /> 已支持 ｜ <img src="http://forum.d2learn.org/assets/plugins/nodebb-plugin-emoji/emoji/android/1f504.png?v=c6uec18e3vu" class="not-responsive emoji emoji-android emoji--arrows_counterclockwise" style="height:23px;width:auto;vertical-align:middle" title=":arrows_counterclockwise:" alt="🔄" /> 计划中</p>
<blockquote>
<p dir="auto"><em>默认</em>：release 二进制走 musl 全静态，Linux x86_64 可直接运行，无 glibc 依赖。</p>
</blockquote>
<h2>文档</h2>
<ul>
<li><a href="docs/00-getting-started.md">快速开始</a> — 5 分钟完成 install → new → build → run</li>
<li><a href="docs/01-examples.md">示例项目</a></li>
<li><a href="docs/02-pack-and-release.md">发布打包</a></li>
<li><a href="docs/03-toolchains.md">工具链管理</a></li>
<li><a href="docs/04-build-from-source.md">从源码构建</a></li>
<li><a href="docs/05-mcpp-toml.md">mcpp.toml 指南</a></li>
<li><a href="docs/06-workspace.md">工作空间</a></li>
</ul>
<p dir="auto">任意命令的完整选项可通过 <code>mcpp &lt;cmd&gt; --help</code> 查阅。</p>
<p dir="auto"><strong>AI 辅助学习</strong>：你可以将以下提示词发给 AI 编码助手，让它帮你快速了解 mcpp：</p>
<pre><code>阅读 https://github.com/mcpp-community/mcpp 仓库的
.agents/skills/mcpp-usage/SKILL.md 和 docs/ 目录下的文档，
告诉我如何用 mcpp 创建一个带依赖的 C++23 模块项目。
</code></pre>
<h2>参与贡献</h2>
<p dir="auto">欢迎通过 Issue 和 PR 参与项目开发。项目接受开发者使用 AI Agent 参与开发与贡献。</p>
<p dir="auto"><strong>基本流程</strong></p>
<ol>
<li>创建 Issue — Bug 修复、新功能、优化等，先在 <a href="https://github.com/mcpp-community/mcpp/issues" rel="nofollow ugc">issues</a> 创建讨论</li>
<li>实现改动 — Fork 仓库，创建分支，实现并验证（<code>mcpp build</code> + E2E 测试）</li>
<li>提交 PR — 使用 <code>gh pr create</code>，确保 CI 通过</li>
<li>CI 必须通过 — CI 不通过的 PR 不会被合入</li>
</ol>
<p dir="auto"><strong>提交信息规范</strong>：<code>feat:</code> / <code>fix:</code> / <code>test:</code> / <code>docs:</code> / <code>refactor:</code> 前缀</p>
<p dir="auto"><strong>AI Agent 贡献</strong>：项目的 <a href=".agents/skills/mcpp-contributing/SKILL.md"><code>.agents/skills/mcpp-contributing/SKILL.md</code></a> 提供了完整的 Agent 贡献流程和项目结构说明。将以下提示词发给 AI 助手即可：</p>
<pre><code>阅读 https://github.com/mcpp-community/mcpp 仓库的
.agents/skills/mcpp-contributing/SKILL.md ，
按照指南帮我给 mcpp 项目提交一个贡献。
</code></pre>
<h2>社区 &amp; 生态</h2>
<ul>
<li><a href="https://forum.d2learn.org/category/20" rel="nofollow ugc">社区论坛</a> — 交流群 (Q: 1067245099)</li>
<li><a href="https://github.com/mcpp-community/mcpp-index" rel="nofollow ugc">mcpp-index</a> — 默认包索引</li>
<li><a href="https://github.com/mcpplibs" rel="nofollow ugc">mcpplibs</a> — 模块化 C++ 库集合</li>
</ul>
<h3>致谢</h3>
<p dir="auto">项目依赖和灵感来源：</p>
<ul>
<li><a href="https://github.com/d2learn/xlings" rel="nofollow ugc">xlings</a> — 工具链 / 包管理底座</li>
<li><a href="https://github.com/mcpplibs/cmdline" rel="nofollow ugc">mcpplibs.cmdline</a> — CLI 框架</li>
<li><a href="https://github.com/ninja-build/ninja" rel="nofollow ugc">ninja</a> — 底层构建引擎</li>
<li><a href="https://github.com/xmake-io/xmake" rel="nofollow ugc">xmake</a> — 跨平台构建工具</li>
<li><a href="https://github.com/rust-lang/cargo" rel="nofollow ugc">cargo</a> — Rust 包管理器</li>
</ul>
]]></description><link>http://forum.d2learn.org/topic/207/mcpp-用-c-23-模块-import-std-开发了个构建工具-并实现自己构建自己-自举</link><guid isPermaLink="true">http://forum.d2learn.org/topic/207/mcpp-用-c-23-模块-import-std-开发了个构建工具-并实现自己构建自己-自举</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Sat, 16 May 2026 01:50:13 GMT</pubDate></item><item><title><![CDATA[从小白的视角探究 vector 第2章]]></title><description><![CDATA[<p dir="auto">@dustchens 在 从小白的视角探究 vector 第2章 中说：</p>
<blockquote>
<p dir="auto">Vector&amp; operator=(const Vector &amp;other) {<br />
// 注意<br />
if(this != &amp;other) {<br />
this-&gt;~Vector();<br />
mSize_e = other.mSize_e;<br />
mCapacity = other.mCapacity;<br />
mDataPtr_e = static_cast&lt;T *&gt;(Alloc::allocate(sizeof(T) * mCapacity));<br />
for (int i = 0; i &lt; mSize_e; i++) {<br />
mDataPtr_e[i] = other.mDataPtr_e[i];<br />
}<br />
}<br />
return *this;<br />
}</p>
</blockquote>
<p dir="auto">这一章节，需要大家思考这段内容，是否正确，为什么没有加上noexcept，noexcept为什么如此重要，需要后续单开一个章节去讲解</p>
]]></description><link>http://forum.d2learn.org/topic/205/从小白的视角探究-vector-第2章</link><guid isPermaLink="true">http://forum.d2learn.org/topic/205/从小白的视角探究-vector-第2章</guid><dc:creator><![CDATA[dustchens]]></dc:creator><pubDate>Tue, 05 May 2026 16:45:29 GMT</pubDate></item><item><title><![CDATA[从小白的视角探究 vector 第一章补充内容]]></title><description><![CDATA[<p dir="auto">@wlly-lzh 智能指针是简化了步骤，不需要你为所有的资源都写一个类包裹，提供了一个通用的托管容器，且还和指针兼容。并且顺手还解决了套壳的问题，RAII对象如果本身也申请在动态空间，套智能指针就不用再写一个套壳类再生成对象托管了。用到对象生命周期去托管的都是RAII，比如各种作用域锁，线程锁这些，都可以用这个思想自动托管</p>
]]></description><link>http://forum.d2learn.org/topic/204/从小白的视角探究-vector-第一章补充内容</link><guid isPermaLink="true">http://forum.d2learn.org/topic/204/从小白的视角探究-vector-第一章补充内容</guid><dc:creator><![CDATA[dustchens]]></dc:creator><pubDate>Tue, 05 May 2026 16:43:42 GMT</pubDate></item><item><title><![CDATA[GCC 16 上手初体验：环境配置、默认 C++20、模块化、诊断增强和 C++26 反射]]></title><description><![CDATA[<h1>GCC 16 上手初体验：环境配置、默认 C++20、模块化、诊断增强和 C++26 反射</h1>
<p dir="auto">从去年发布GCC 15.1 并支持 <code>import std</code>开始, 我的新项目也全面转向<code>C++23 + 模块化</code> (踩了不少坑 [逃]). 而最近几天 GCC 16.1 也正式发布了, 这篇文章就来初步的上手体验一下.</p>
<p dir="auto">主要内容包括:</p>
<ul>
<li>0.GCC 16 环境配置</li>
<li>1.默认标准: 从C++17升级到C++20, 正式进入C++2x时代</li>
<li>2.模块化: 有一定优化, 但任处于实验性支持阶段 (悲)</li>
<li>3.代码诊断和静态分析增强</li>
<li>4.C++ 26 反射实验性支持</li>
<li>5.总结及相关链接</li>
</ul>
<h2>0. 环境配置 (Linux)</h2>
<p dir="auto">安装GCC 16可以选择按官方文档从源码进行构建 <a href="https://gcc.gnu.org/wiki/InstallingGCC" rel="nofollow ugc">GCC WIKI</a> 或 直接使用xlings工具安装预构建版本(注: 该方式有个好处不污染系统环境)</p>
<p dir="auto"><code>安装xlings包管理工具</code></p>
<pre><code class="language-bash">curl -fsSL https://raw.githubusercontent.com/openxlings/xlings/refs/heads/main/tools/other/quick_install.sh | bash
source ~/.bashrc # 或重新打开一次控制台
xlings -h
</code></pre>
<p dir="auto"><code>xlings工具安装后, 创建隔离环境并安装gcc 16</code></p>
<pre><code class="language-bash">xlings subos new gcc-test
xlings subos use gcc-test
xlings install gcc@16.1.0 -y
gcc --version
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1777910290747-2026-05-04_22-10.png" alt="2026-05-04_22-10.png" class=" img-fluid img-markdown" /></p>
<h2>1.默认标准: 从 C++17 升级到 C++20, 正式进入 C++2x 时代</h2>
<p dir="auto">GCC 16 的一个关键变化是: C++ 编译默认标准从 GNU++17 变成 GNU++20。不用额外再写 <code>-std=c++20</code> 也能编译下面的程序了:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

consteval int answer() {
    return 16;
}

int main() {
    std::cout &lt;&lt; "__cplusplus=" &lt;&lt; __cplusplus
              &lt;&lt; ", consteval=" &lt;&lt; answer() &lt;&lt; '\n';
}
</code></pre>
<p dir="auto">编译运行:</p>
<pre><code class="language-bash">g++ cpp20-default.cpp -o cpp20-default
./cpp20-default
</code></pre>
<p dir="auto">输出:</p>
<pre><code class="language-text">__cplusplus=202002, consteval=16
</code></pre>
<p dir="auto">如果显式退回 C++17:</p>
<pre><code class="language-bash">g++ -std=c++17 cpp20-default.cpp -o cpp17-check
</code></pre>
<p dir="auto">会报错:</p>
<pre><code class="language-cpp">t.cpp:3:1: error: 'consteval' does not name a type; did you mean 'constexpr'?
    3 | consteval int answer() {
      | ^~~~~~~~~
      | constexpr
</code></pre>
<p dir="auto">默认标准的改变, 不仅仅只是帮我们省了<code>-std=c++20</code>，而是默认构建行为的改变 会加速C++ 2x时代生态的发展</p>
<h3>2.模块化: 有一定优化, 但任处于实验性支持阶段</h3>
<p dir="auto">模块化早在C++20就发布, 他的目标是想解决 C++ 头文件模型长期存在的问题: 重复解析、宏污染、包含顺序敏感、接口和实现边界不够清晰。在工程方面他对C++的影响是颠覆性的, 但是由于历史/兼容性/复杂度等多方面原因导致, GCC 16 的默认标准虽然是 GNU++20，但 modules 支持仍然是实验性的，所以GCC 16对模块化爱好者来说只能算波澜不惊</p>
<p dir="auto">只不过, GCC16 还是有在模块化做了一些工作的</p>
<ul>
<li>修复了一些模块化的bug</li>
<li>新增 <code>--compile-std-module</code>，用于更方便地构建标准库相关模块和 header unit</li>
</ul>
<p dir="auto">其中 <code>--compile-std-module</code> 的增加 更方便大家体验模块化和<code>import std</code>, 避免了之前连一个hello world级别的main.cpp编译都要分几步的情况(有时候还有问题), 所以这也算是一大进步 - 现在可以像下面一样一键编译 <code>import std</code> 的程序了</p>
<pre><code class="language-cpp">// main.cpp
import std;

int main() {
    std::println("{}", 42);
}
</code></pre>
<p dir="auto">编译:</p>
<pre><code class="language-bash">g++ -std=c++23 -fmodules --compile-std-module main.cpp -o app
./app
</code></pre>
<h2>3. 诊断增强: 错误信息结构化 + 编译期静态代码分析</h2>
<p dir="auto">C++ 报错经常被吐槽，不是因为编译器不知道哪里错了，而是因为错误链太长，人很难从一堆候选函数、模板实例化和类型展开里看出主线。</p>
<p dir="auto">GCC 16 的一个明显变化是，部分 C++ 错误信息开始用层级结构展示。例如这个声明和定义不一致的例子:</p>
<pre><code class="language-cpp">class Foo {
public:
    void test(int i, int j, void *ptr, int k);
};

void Foo::test(int i, int j, const void *ptr, int k) {
}

int main() {
    return 0;
}
</code></pre>
<p dir="auto">编译:</p>
<pre><code class="language-bash">g++ diagnostics-mismatch.cpp
</code></pre>
<p dir="auto">GCC 16 会把候选函数和参数差异分层展示，核心信息大致是:</p>
<pre><code class="language-text">error: no declaration matches 'void Foo::test(int, int, const void*, int)'
  - there is 1 candidate
    - candidate is: 'void Foo::test(int, int, void*, int)'
      - parameter 3 of candidate has type 'void*'
      - which does not match type 'const void*'
</code></pre>
<p dir="auto">这比以前只告诉你 找不到匹配声明 更有用，它一定程度指出了候选是谁、哪里不一致、哪一个参数出了问题。</p>
<p dir="auto">甚至还能生成更适合浏览器查看的诊断html页面:</p>
<pre><code class="language-bash">g++ diagnostics-mismatch.cpp \
  -fdiagnostics-add-output=experimental-html
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1777910315147-2026-05-04_22-55.png" alt="2026-05-04_22-55.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">如果想给 CI、IDE 或代码扫描平台使用，可以生成 SARIF:</p>
<pre><code class="language-bash">g++ diagnostics-mismatch.cpp \
  -fdiagnostics-format=sarif 
</code></pre>
<p dir="auto">这个的优化, 不仅 报错更容易看了，而且后面可能会影响工具链体验。编译器不再只是把错误打印到终端，而是可以把结构化诊断交给网页、编辑器、代码审查和静态分析系统。</p>
<p dir="auto">配合上 <code>-fanalyzer</code> 的能力。它是 GCC 自带的静态分析能力。如果加上 <code>-Werror</code> 体验就有点类似Rust的严格编译期检查功能</p>
<p dir="auto">看一个 use-after-delete:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

int main() {
    int *p = new int(42);
    delete p;
    std::cout &lt;&lt; *p &lt;&lt; "\n";
}
</code></pre>
<p dir="auto">编译:</p>
<pre><code class="language-bash">g++ -std=c++20 -fanalyzer analyzer-uaf.cpp
</code></pre>
<p dir="auto">GCC 16 会给出类似警告:</p>
<pre><code class="language-text">warning: use after 'delete' of 'p' [CWE-416] [-Wanalyzer-use-after-free]
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1777910360646-6ac11e44-be1d-4668-bd20-b4243eb62f81-image.png" alt="6ac11e44-be1d-4668-bd20-b4243eb62f81-image.png" class=" img-fluid img-markdown" /></p>
<h2>4. C++26 特性: Reflection / 反射</h2>
<p dir="auto">GCC 16 实现了若干 C++26 特性，这里简单试一试</p>
<pre><code class="language-bash">-std=c++26 -freflection
</code></pre>
<p dir="auto">以一个简单的结构体为例, 看看 C++26反射 的功能:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;meta&gt;
#include &lt;string_view&gt;

struct User {
    int id;
    double score;
};

consteval std::size_t field_count() {
    auto fields = std::meta::nonstatic_data_members_of(
        ^^User,
        std::meta::access_context::unchecked()
    );
    return fields.size();
}

consteval std::string_view field_name(std::size_t index) {
    auto fields = std::meta::nonstatic_data_members_of(
        ^^User,
        std::meta::access_context::unchecked()
    );
    return std::meta::identifier_of(fields[index]);
}

consteval std::string_view field_type(std::size_t index) {
    auto fields = std::meta::nonstatic_data_members_of(
        ^^User,
        std::meta::access_context::unchecked()
    );
    return std::meta::display_string_of(std::meta::type_of(fields[index]));
}

int main() {
    constexpr auto type_name = std::meta::display_string_of(^^User);

    std::cout &lt;&lt; type_name &lt;&lt; " has " &lt;&lt; field_count() &lt;&lt; " fields\n";
    std::cout &lt;&lt; field_name(0) &lt;&lt; ": " &lt;&lt; field_type(0) &lt;&lt; '\n';
    std::cout &lt;&lt; field_name(1) &lt;&lt; ": " &lt;&lt; field_type(1) &lt;&lt; '\n';
}
</code></pre>
<p dir="auto">编译运行:</p>
<pre><code class="language-bash">g++ -std=c++26 -freflection reflection-user.cpp -o reflection-user
./reflection-user
</code></pre>
<p dir="auto">输出:</p>
<pre><code class="language-text">User has 2 fields
id: int
score: double
</code></pre>
<p dir="auto">这里的 <code>^^User</code> 是对 <code>User</code> 这个结构体类型做静态反射，<code>std::meta::display_string_of</code> 可以拿到类型的显示名。<code>std::meta::nonstatic_data_members_of</code> 则能拿到结构体的非静态数据成员列表，再通过 <code>identifier_of</code> 和 <code>type_of</code> 分别取得成员名和成员类型。</p>
<p dir="auto">C++ 代码可以在编译期拿到结构体自身的字段信息。这个功能对 序列化、ORM、RPC、命令行参数解析、UI 绑定、测试生成等大量现在依赖宏、模板技巧或外部代码生成的场景 有重要影响</p>
<h2>5. 总结</h2>
<p dir="auto">GCC 16.1.0 感觉最核心的就是默认标准从C++17变成了C++20, 某种意义上也算正式迈入C++2x时代了, 下面是一些个人感觉</p>
<ul>
<li>1.默认 C++ 标准从 GNU++17 变成 GNU++20。能进一步加速C++生态进入C++2x的时代</li>
<li>2.C++20 modules特性 在 GCC 16 里只是做了部分优化, 相比GCC 15.1.0引入import std来说, 没有特别惊喜</li>
<li>3.诊断输出更结构化了。嵌套错误、HTML、SARIF 会让编译器错误更适合教学、CI 和 IDE 集成。</li>
<li>4.C++26 Reflection 已经可以初步尝试。对于个人项目可以上手用一用 (但可能存在很多潜在的坑)</li>
</ul>
<p dir="auto">我个人是比较关注模块化的进展, 总体来说GCC16虽然模块化特性上没有过多惊喜, 但在<code>import std</code>之后, 模块化算是已经初步可以在项目里尝试的水平了, 并且我们 mcpp-community 现代C++爱好者社区 已经在 模块化的 项目/库的 工程化、包管理、工具链 等方面有一定的探索, 欢迎感兴趣的朋友加入讨论</p>
<ul>
<li>社区Github主页: <a href="https://github.com/mcpp-community" rel="nofollow ugc">https://github.com/mcpp-community</a></li>
<li>C++23模块化项目: <a href="https://github.com/openxlings/xlings" rel="nofollow ugc">https://github.com/openxlings/xlings</a></li>
<li>C++23模块化库: <a href="https://github.com/mcpplibs" rel="nofollow ugc">https://github.com/mcpplibs</a></li>
</ul>
<h2>相关链接</h2>
<ul>
<li>xlings: <a href="https://github.com/openxlings/xlings" rel="nofollow ugc">https://github.com/openxlings/xlings</a></li>
<li>mcpp-community: <a href="https://github.com/mcpp-community" rel="nofollow ugc">https://github.com/mcpp-community</a></li>
<li>GCC 16.1 Released: <a href="https://gcc.gnu.org/pipermail/gcc-announce/2026/000190.html" rel="nofollow ugc">https://gcc.gnu.org/pipermail/gcc-announce/2026/000190.html</a></li>
<li>GCC 16 Release Series: Changes, New Features, and Fixes: <a href="https://gcc.gnu.org/gcc-16/changes.html" rel="nofollow ugc">https://gcc.gnu.org/gcc-16/changes.html</a></li>
<li>GCC 16.1.0: <a href="https://sourceware.org/pub/gcc/releases/gcc-16.1.0/" rel="nofollow ugc">https://sourceware.org/pub/gcc/releases/gcc-16.1.0/</a></li>
</ul>
]]></description><link>http://forum.d2learn.org/topic/203/gcc-16-上手初体验-环境配置-默认-c-20-模块化-诊断增强和-c-26-反射</link><guid isPermaLink="true">http://forum.d2learn.org/topic/203/gcc-16-上手初体验-环境配置-默认-c-20-模块化-诊断增强和-c-26-反射</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Mon, 04 May 2026 16:12:56 GMT</pubDate></item><item><title><![CDATA[从小白的视角探究 vector]]></title><description><![CDATA[<p dir="auto">@dustchens 在 从小白的视角探究 vector 中说：</p>
<blockquote>
<p dir="auto">光讲套壳，这和 vector 又有什么关系呢？深水区来了。</p>
</blockquote>
<p dir="auto">第一节的精髓在于这一段之后的内容。不过我没有给出栈和作用域等内容的讲解。这段内容本身是非常复杂的，但是副作用却很小，小到每个人编程一开始都能无障碍使用。</p>
<p dir="auto">拿函数来类比vector，就是因为我感觉缺少一个能够切入申请空间和管理生命周期的点，如果说每个人一开始就能写的main函数，是最简化了空间管理和生命周期管理，让你意识不到它的存在，那么vector就是需要我们把这套内容拿到明面上来，且二者的本质是一样的（从空间和生命周期管理的语义来看）</p>
]]></description><link>http://forum.d2learn.org/topic/196/从小白的视角探究-vector</link><guid isPermaLink="true">http://forum.d2learn.org/topic/196/从小白的视角探究-vector</guid><dc:creator><![CDATA[dustchens]]></dc:creator><pubDate>Wed, 29 Apr 2026 19:12:23 GMT</pubDate></item><item><title><![CDATA[请教如何自定义异常]]></title><description><![CDATA[class myException : public std::exception {
private:
    std::string _msg;
public:
    myException(const char* message) noexcept : _msg(message) {}
    
    const char* what() const noexcept override {
        return _msg.c_str();
    }
};

]]></description><link>http://forum.d2learn.org/topic/182/请教如何自定义异常</link><guid isPermaLink="true">http://forum.d2learn.org/topic/182/请教如何自定义异常</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Sun, 29 Mar 2026 05:14:20 GMT</pubDate></item><item><title><![CDATA[[安装问题]安装本地环境时，vscode 编译器设置错误]]></title><description><![CDATA[<p dir="auto">执行d2x checker时报错：<br />
[ 23%]: cache compiling.release dslings/en/hello-mcpp.cpp<br />
error: [error] xlings: shim recursion detected for 'g++' (depth=8)<br />
[error]   hint: the real 'g++' binary may not be installed</p>
<blockquote>
<p dir="auto">in dslings/en/hello-mcpp.cpp<br />
error: exec(xmake build 00-0-hello-mcpp) failed(255), unknown reason</p>
</blockquote>
<p dir="auto"><img src="/assets/uploads/files/1773586304858-a8b194c4-540b-4edd-b5f7-f8fcb727514b-image-resized.png" alt="a8b194c4-540b-4edd-b5f7-f8fcb727514b-image.png" class=" img-fluid img-markdown" /></p>
]]></description><link>http://forum.d2learn.org/topic/179/安装问题-安装本地环境时-vscode-编译器设置错误</link><guid isPermaLink="true">http://forum.d2learn.org/topic/179/安装问题-安装本地环境时-vscode-编译器设置错误</guid><dc:creator><![CDATA[Whynot-z]]></dc:creator><pubDate>Sun, 15 Mar 2026 14:54:32 GMT</pubDate></item><item><title><![CDATA[[windows系统][环境配置] d2x命令好像无法使用？]]></title><description><![CDATA[<p dir="auto">image.png<br />
WSL配置环境失败，d2x install d2mcpp执行失败。</p>
<p dir="auto">问题解决了，执行一次xlings update更新索引就可以拉取了<br />
image.png</p>
]]></description><link>http://forum.d2learn.org/topic/178/windows系统-环境配置-d2x命令好像无法使用</link><guid isPermaLink="true">http://forum.d2learn.org/topic/178/windows系统-环境配置-d2x命令好像无法使用</guid><dc:creator><![CDATA[Musubit]]></dc:creator><pubDate>Fri, 27 Feb 2026 09:19:10 GMT</pubDate></item><item><title><![CDATA[dx2命令无效]]></title><description><![CDATA[<p dir="auto">具体参考</p>
<p dir="auto">http://forum.d2learn.org/post/774</p>
<p dir="auto">e0284a32-24d0-4bd1-98a7-df45b10c84e5-image.png</p>
]]></description><link>http://forum.d2learn.org/topic/177/dx2命令无效</link><guid isPermaLink="true">http://forum.d2learn.org/topic/177/dx2命令无效</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Thu, 26 Feb 2026 08:44:43 GMT</pubDate></item><item><title><![CDATA[xlings安装完成，但是项目安装提示失败]]></title><description><![CDATA[<p dir="auto">@sleepyiang 找到原因, 这个时项目里d2x buildtools的bug<br />
现在已经修复了</p>

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

<p dir="auto">可以使用 d2x install d2mcpp 获取最新的项目 再尝试尝试</p>
<p dir="auto">注: 应该不是上面说的版本原因</p>
]]></description><link>http://forum.d2learn.org/topic/176/xlings安装完成-但是项目安装提示失败</link><guid isPermaLink="true">http://forum.d2learn.org/topic/176/xlings安装完成-但是项目安装提示失败</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Wed, 25 Feb 2026 01:17:56 GMT</pubDate></item><item><title><![CDATA[C&#x2F;C++的神奇&quot;语法&quot;, 趋向操作 &#96;x --&gt; 0&#96;]]></title><description><![CDATA[<p dir="auto">我怎么说没见过，原来是两个运算符的组合：-- 自减运算符和 &gt; 大于运算符。</p>
<p dir="auto">先判断 x 是否大于0，若成立则 x 自减。这样 x 就会像 0 趋近，直到不大于 0。这种写法其实就是 (x--) &gt; 0……</p>
]]></description><link>http://forum.d2learn.org/topic/175/c-c-的神奇-语法-趋向操作-x-0</link><guid isPermaLink="true">http://forum.d2learn.org/topic/175/c-c-的神奇-语法-趋向操作-x-0</guid><dc:creator><![CDATA[unamed-coder]]></dc:creator><pubDate>Tue, 24 Feb 2026 11:40:11 GMT</pubDate></item><item><title><![CDATA[刚学 C++ 模块想要尝试声明与定义分离，结果失败了]]></title><description><![CDATA[<p dir="auto">看起来像是 ConsolePrint 和 encipherment 的问题, 错误提示有找不到模块 ConsolePrint 以及 encipherment 不是个命名空间.<br />
我没有用过这个库, 不确定是不是需要额外配置, 可以先替换成 std::println 试试?</p>
]]></description><link>http://forum.d2learn.org/topic/172/刚学-c-模块想要尝试声明与定义分离-结果失败了</link><guid isPermaLink="true">http://forum.d2learn.org/topic/172/刚学-c-模块想要尝试声明与定义分离-结果失败了</guid><dc:creator><![CDATA[lost-42]]></dc:creator><pubDate>Sun, 22 Feb 2026 12:43:56 GMT</pubDate></item><item><title><![CDATA[C++ 模块中静态全局变量的消失问题]]></title><description><![CDATA[<p dir="auto">错误例子（我写的）</p>
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
}


<p dir="auto">正确例子（官方库提供的）</p>
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 &lt; 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) &amp; S_IFREG) == S_IFREG)
#endif // S_ISREG

#ifndef S_ISDIR
#define S_ISDIR(m) (((m) &amp; S_IFDIR) == S_IFDIR)
#endif // S_ISDIR

#ifndef NOMINMAX
#define NOMINMAX
#endif // NOMINMAX

#include &lt;io.h&gt;
#include &lt;winsock2.h&gt;
#include &lt;ws2tcpip.h&gt;

#if defined(__has_include)
#if __has_include(&lt;afunix.h&gt;)
// afunix.h uses types declared in winsock2.h, so has to be included after it.
#include &lt;afunix.h&gt;
#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 &lt;arpa/inet.h&gt;
#if !defined(_AIX) &amp;&amp; !defined(__MVS__)
#include &lt;ifaddrs.h&gt;
#endif
#ifdef __MVS__
#include &lt;strings.h&gt;
#ifndef NI_MAXHOST
#define NI_MAXHOST 1025
#endif
#endif
#include &lt;net/if.h&gt;
#include &lt;netdb.h&gt;
#include &lt;netinet/in.h&gt;
#ifdef __linux__
#include &lt;resolv.h&gt;
#undef _res // Undefine _res macro to avoid conflicts with user code (#2278)
#endif
#include &lt;csignal&gt;
#include &lt;netinet/tcp.h&gt;
#include &lt;poll.h&gt;
#include &lt;pthread.h&gt;
#include &lt;sys/mman.h&gt;
#include &lt;sys/socket.h&gt;
#include &lt;sys/un.h&gt;
#include &lt;unistd.h&gt;

#ifndef INVALID_SOCKET
#define INVALID_SOCKET (-1)
#endif
#endif //_WIN32

#if defined(__APPLE__)
#include &lt;TargetConditionals.h&gt;
#endif

#include &lt;algorithm&gt;
#include &lt;array&gt;
#include &lt;atomic&gt;
#include &lt;cassert&gt;
#include &lt;cctype&gt;
#include &lt;chrono&gt;
#include &lt;climits&gt;
#include &lt;condition_variable&gt;
#include &lt;cstdlib&gt;
#include &lt;cstring&gt;
#include &lt;errno.h&gt;
#include &lt;exception&gt;
#include &lt;fcntl.h&gt;
#include &lt;functional&gt;
#include &lt;iomanip&gt;
#include &lt;iostream&gt;
#include &lt;list&gt;
#include &lt;map&gt;
#include &lt;memory&gt;
#include &lt;mutex&gt;
#include &lt;random&gt;
#include &lt;regex&gt;
#include &lt;set&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;sys/stat.h&gt;
#include &lt;system_error&gt;
#include &lt;thread&gt;
#include &lt;unordered_map&gt;
#include &lt;unordered_set&gt;
#include &lt;utility&gt;

#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) ||                        \
    defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
#if TARGET_OS_MAC
#include &lt;CFNetwork/CFHost.h&gt;
#include &lt;CoreFoundation/CoreFoundation.h&gt;
#endif
#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO or
       // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN

#ifdef CPPHTTPLIB_OPENSSL_SUPPORT
#ifdef _WIN32
#include &lt;wincrypt.h&gt;

// 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 &lt;Security/Security.h&gt;
#endif
#endif // CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO

#include &lt;openssl/err.h&gt;
#include &lt;openssl/evp.h&gt;
#include &lt;openssl/ssl.h&gt;
#include &lt;openssl/x509v3.h&gt;

#if defined(_WIN32) &amp;&amp; defined(OPENSSL_USE_APPLINK)
#include &lt;openssl/applink.c&gt;
#endif

#include &lt;iostream&gt;
#include &lt;sstream&gt;

#if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER)
#if OPENSSL_VERSION_NUMBER &lt; 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 &lt; 0x30000000L
#error Sorry, OpenSSL versions prior to 3.0.0 are not supported
#endif

#endif // CPPHTTPLIB_OPENSSL_SUPPORT

#ifdef CPPHTTPLIB_MBEDTLS_SUPPORT
#include &lt;mbedtls/ctr_drbg.h&gt;
#include &lt;mbedtls/entropy.h&gt;
#include &lt;mbedtls/error.h&gt;
#include &lt;mbedtls/md5.h&gt;
#include &lt;mbedtls/net_sockets.h&gt;
#include &lt;mbedtls/oid.h&gt;
#include &lt;mbedtls/pk.h&gt;
#include &lt;mbedtls/sha1.h&gt;
#include &lt;mbedtls/sha256.h&gt;
#include &lt;mbedtls/sha512.h&gt;
#include &lt;mbedtls/ssl.h&gt;
#include &lt;mbedtls/x509_crt.h&gt;
#ifdef _WIN32
#include &lt;wincrypt.h&gt;
#ifdef _MSC_VER
#pragma comment(lib, "crypt32.lib")
#endif
#endif // _WIN32
#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)
#if TARGET_OS_MAC
#include &lt;Security/Security.h&gt;
#endif
#endif // CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN

// Mbed TLS 3.x API compatibility
#if MBEDTLS_VERSION_MAJOR &gt;= 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 &lt;zlib.h&gt;
#endif

#ifdef CPPHTTPLIB_BROTLI_SUPPORT
#include &lt;brotli/decode.h&gt;
#include &lt;brotli/encode.h&gt;
#endif

#ifdef CPPHTTPLIB_ZSTD_SUPPORT
#include &lt;zstd.h&gt;
#endif


export module httplib;

export extern "C++" {
    #include "httplib.h"
}



<p dir="auto">当你试图将一个非模块化的第三方库（尤其是像 httplib 这种带全局状态或初始化逻辑的库）封装进模块时：</p>
<p dir="auto">不要尝试只导出部分类型：除非你非常确定该库没有全局初始化逻辑（Constructor static guards）。</p>
<p dir="auto">使用 export extern "C++"：这是将传统头文件“模块化”的最标准、最稳妥做法。</p>
<p dir="auto">环境对齐：在 module; 之后，务必把该库依赖的所有系统宏（如 _WIN32, WIN32_LEAN_AND_MEAN 等）都写清楚。</p>
]]></description><link>http://forum.d2learn.org/topic/171/c-模块中静态全局变量的消失问题</link><guid isPermaLink="true">http://forum.d2learn.org/topic/171/c-模块中静态全局变量的消失问题</guid><dc:creator><![CDATA[woshinideba1425]]></dc:creator><pubDate>Thu, 19 Feb 2026 14:08:09 GMT</pubDate></item><item><title><![CDATA[【C++11】异步操作]]></title><description><![CDATA[<p dir="auto">总结很好</p>
]]></description><link>http://forum.d2learn.org/topic/170/c-11-异步操作</link><guid isPermaLink="true">http://forum.d2learn.org/topic/170/c-11-异步操作</guid><dc:creator><![CDATA[SPeak]]></dc:creator><pubDate>Fri, 13 Feb 2026 09:31:00 GMT</pubDate></item><item><title><![CDATA[C++ 包管理器选哪个？]]></title><description><![CDATA[<p dir="auto">除了vcpkg 和 xmake(xrepo) 的话, conan 比较受欢迎</p>
]]></description><link>http://forum.d2learn.org/topic/169/c-包管理器选哪个</link><guid isPermaLink="true">http://forum.d2learn.org/topic/169/c-包管理器选哪个</guid><dc:creator><![CDATA[Nekoycode]]></dc:creator><pubDate>Thu, 12 Feb 2026 05:59:03 GMT</pubDate></item><item><title><![CDATA[MC++编码风格探讨 - 标识符命名风格]]></title><description><![CDATA[<p dir="auto">@SkyWingF 后面给项目增加一个 类似 "最佳实践" 章节总结这些:</p>

类型别名用using 代替 typedef
引用的使用
尽量少使用宏 非必要不使用
属性标识 &lsqb;&lsqb;nodiscard&rsqb;&rsqb;, &lsqb;&lsqb;deprecated&rsqb;&rsqb;
...

]]></description><link>http://forum.d2learn.org/topic/167/mc-编码风格探讨-标识符命名风格</link><guid isPermaLink="true">http://forum.d2learn.org/topic/167/mc-编码风格探讨-标识符命名风格</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Tue, 10 Feb 2026 16:46:06 GMT</pubDate></item><item><title><![CDATA[mcpp在远程连接ubuntu的vscode中使用d2x checker命令，编辑器无法识别代码]]></title><description><![CDATA[<p dir="auto">@sunrisepeak 解决了👍</p>
]]></description><link>http://forum.d2learn.org/topic/166/mcpp在远程连接ubuntu的vscode中使用d2x-checker命令-编辑器无法识别代码</link><guid isPermaLink="true">http://forum.d2learn.org/topic/166/mcpp在远程连接ubuntu的vscode中使用d2x-checker命令-编辑器无法识别代码</guid><dc:creator><![CDATA[fillSea]]></dc:creator><pubDate>Sat, 07 Feb 2026 02:49:27 GMT</pubDate></item><item><title><![CDATA[关于学习C++中的int main中new一个新的伐对象的困惑]]></title><description><![CDATA[<p dir="auto">@sunrisepeak 谢谢。我已经理解了</p>
]]></description><link>http://forum.d2learn.org/topic/165/关于学习c-中的int-main中new一个新的伐对象的困惑</link><guid isPermaLink="true">http://forum.d2learn.org/topic/165/关于学习c-中的int-main中new一个新的伐对象的困惑</guid><dc:creator><![CDATA[g202080272]]></dc:creator><pubDate>Fri, 06 Feb 2026 04:15:42 GMT</pubDate></item><item><title><![CDATA[在linux环境下创建C++ drogon 项目 进行接口测试(项目推动型学习)]]></title><description><![CDATA[<p dir="auto">​</p>
<p dir="auto">项目简单（仅为学习）<br />
我并不是很会这个框架 还在学习中<br />
环境准备（Ubuntu 22.04）</p>
<pre><code>gcc --version
</code></pre>
<p dir="auto">检查当前GCC版本：<br />
gcc --version<br />
<img src="/assets/uploads/files/1770194231828-e89ff7bd-b51b-4307-a36d-1633946d9aed-image.png" alt="e89ff7bd-b51b-4307-a36d-1633946d9aed-image.png" class=" img-fluid img-markdown" /><br />
​​</p>
<p dir="auto">图1-1(C++版本查询)</p>
<pre><code>g++ -v --help 2&gt;&amp;1 | grep "std="
</code></pre>
<p dir="auto">若版本低于9.0，需执行以下升级操作：</p>
<pre><code>sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt install build-essential git cmake -y
sudo apt install gcc-10 g++-10 -y
</code></pre>
<p dir="auto">验证C++17支持：</p>
<pre><code>g++ -v --help 2&gt;&amp;1 | grep "std="
</code></pre>
<p dir="auto">输出应包含gnu++17或c++17 例如:<br />
<img src="/assets/uploads/files/1770194812553-44588389-29ae-4f9f-b77a-a2b05a787e30-image-resized.png" alt="44588389-29ae-4f9f-b77a-a2b05a787e30-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto"><img src="/assets/uploads/files/1770194868256-3a1a02a9-8c7a-4c3f-a283-df44d21f8e0e-image-resized.png" alt="3a1a02a9-8c7a-4c3f-a283-df44d21f8e0e-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">MySQL依赖安装（）</p>
<p dir="auto">安装MariaDB开发库drogon：</p>
<pre><code>sudo apt install -y libmariadb-dev
</code></pre>
<p dir="auto">创建源码目录并克隆仓库：</p>
<pre><code>mkdir drogon_src &amp;&amp; cd drogon_src
git clone https://github.com/drogonframework/drogon
</code></pre>
<p dir="auto">编译安装：</p>
<pre><code>cd drogon
mkdir build &amp;&amp; cd build
cmake ..
</code></pre>
<p dir="auto">初次编译可能会遇到缺失trantor 子模块（Drogon 的网络库依赖）没有被正确下载或初始化。<br />
<img src="/assets/uploads/files/1770195243138-118d02d3-c6b4-48bf-b7aa-23320874463a-image-resized.png" alt="118d02d3-c6b4-48bf-b7aa-23320874463a-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">笔者解决办法为：</p>
<pre><code># 进入 Drogon 源码根目录
cd ~/drogon/drogon
</code></pre>
<pre><code># 初始化并更新所有子模块
git submodule update --init --recursive
</code></pre>
<p dir="auto">编译</p>
<h1>编译安装 （nproc）调用当前可用核心数用于编译</h1>
<pre><code>make -j$(nproc)
</code></pre>
<p dir="auto">等待编译：<br />
<img src="/assets/uploads/files/1770195498278-3e65e501-04c1-4834-a887-5dceac785151-image-resized.png" alt="3e65e501-04c1-4834-a887-5dceac785151-image.png" class=" img-fluid img-markdown" /><br />
环境验证<br />
验证drogon 是否安装成功 出现以下版本信息即可。<br />
<img src="/assets/uploads/files/1770195538195-dd1d52ba-a9af-4ac2-a3e2-3e7050a5d9fa-image-resized.png" alt="dd1d52ba-a9af-4ac2-a3e2-3e7050a5d9fa-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">*** 使用drogon_ctl创建项目。**<br />
         <br />
        在自己喜欢的文件夹中创建项目</p>
<p dir="auto"><img src="/assets/uploads/files/1770195648710-6369b916-ea68-47b6-8df7-b4b0ae4a5af7-image.png" alt="6369b916-ea68-47b6-8df7-b4b0ae4a5af7-image.png" class=" img-fluid img-markdown" /></p>
<pre><code>drogon_ctl create project Hello-drogon
cd Hello-drogon
</code></pre>
<p dir="auto">进入Hello-drogon的controllers 中在终端新建一个控制器。</p>
<pre><code>#drogon_ctl create controller [参数] [控制器名(自定义)] 
drogon_ctl create controller -h drogonpic
</code></pre>
<p dir="auto"><img src="/assets/uploads/files/1770196352685-561bc505-8380-471c-b7cb-411941a64b8e-image-resized.png" alt="561bc505-8380-471c-b7cb-411941a64b8e-image.png" class=" img-fluid img-markdown" /><br />
编写测试接口<br />
<img src="/assets/uploads/files/1770196229170-23d96a12-94d0-4475-8af6-12fde87bad74-image.png" alt="23d96a12-94d0-4475-8af6-12fde87bad74-image.png" class=" img-fluid img-markdown" /><br />
编写一个简单的接口，该接口包含两个方法 路径为“api/pic”，“api/hello”,仅仅返回"hello drogon"的字符<br />
drogonpic.h 代码：</p>
<p dir="auto">// drogonpic.h 头文件编写。</p>
<pre><code>#pragma once

#include &lt;drogon/HttpController.h&gt;

using namespace drogon;

class drogonpic : public drogon::HttpController&lt;drogonpic&gt;
{
public:
    METHOD_LIST_BEGIN
        // 确保类名正确
        ADD_METHOD_TO(drogonpic::getPic, "/api/pic", Get);
        ADD_METHOD_TO(drogonpic::hello, "/api/hello", Get);
    METHOD_LIST_END
    //hello world 
     void hello(const HttpRequestPtr&amp; req,
                std::function&lt;void(const HttpResponsePtr&amp;)&gt;&amp;&amp; callback) const;

    // 图片获取方法
    void getPic(const HttpRequestPtr&amp; req,
                std::function&lt;void(const HttpResponsePtr&amp;)&gt;&amp;&amp; callback) const;
    
};
</code></pre>
<p dir="auto"><a href="http://xn--drogonpic-uo4qg23s.cc" rel="nofollow ugc">实现drogonpic.cc</a></p>
<pre><code>#include "drogonpic.h"
#include &lt;drogon/HttpResponse.h&gt;
#include &lt;drogon/drogon.h&gt; // 添加日志支持
#include &lt;sys/stat.h&gt;

using namespace drogon;

void drogonpic::getPic(const HttpRequestPtr&amp; req,
                       std::function&lt;void(const HttpResponsePtr&amp;)&gt;&amp;&amp; callback) const
{
    // 使用绝对路径更可靠
    const std::string imagePath = "/home/xhm/xhm/Drogon-Project/Hello-drogon/assets/pic2.png";
    
    // 记录路径信息（调试用）
    LOG_INFO &lt;&lt; "Attempting to load image: " &lt;&lt; imagePath;
    
    // 检查文件是否存在
    struct stat buffer;
    if (stat(imagePath.c_str(), &amp;buffer) != 0) 
    {
        LOG_ERROR &lt;&lt; "Image not found: " &lt;&lt; imagePath;
        auto resp = HttpResponse::newHttpResponse();
        resp-&gt;setStatusCode(k404NotFound);
        resp-&gt;setBody("Image not found");
        callback(resp);
        return;
    }

    // 创建文件响应
    auto resp = HttpResponse::newFileResponse(imagePath, "", CT_IMAGE_PNG);
    
    if (!resp) 
    {
        LOG_ERROR &lt;&lt; "Failed to open image: " &lt;&lt; imagePath;
        resp = HttpResponse::newHttpResponse();
        resp-&gt;setStatusCode(k500InternalServerError);
        resp-&gt;setBody("Failed to open image");
    }
    else 
    {
        LOG_INFO &lt;&lt; "Image loaded successfully: " &lt;&lt; imagePath;
    }
    
    callback(resp);
}



        // 处理GET请求的方法
        void drogonpic::hello(const HttpRequestPtr&amp; req,
            std::function&lt;void(const HttpResponsePtr&amp;)&gt;&amp;&amp; callback) const
    {
        // 创建HTTP响应对象
        auto resp = HttpResponse::newHttpResponse();

        // 设置响应内容
        resp-&gt;setBody("hello world");

        // 设置响应状态码（可选，默认200）
        // resp-&gt;setStatusCode(k200OK);

        // 通过回调返回响应
        callback(resp);
    }
</code></pre>
<p dir="auto">对接口进行测试<br />
对api/hello 测试 使用apipost 进行测试 测试结果如下图所示：ip地址为linux主机的ip</p>
<p dir="auto">网页访问：<br />
<img src="/assets/uploads/files/1770194370743-04bb82cd-049f-4665-9037-9c5c44598877-image.png" alt="04bb82cd-049f-4665-9037-9c5c44598877-image.png" class=" img-fluid img-markdown" /><br />
<img src="/assets/uploads/files/1770194348828-a8f35a9d-29d1-4a3c-ae98-4c4a87e71c1d-image-resized.png" alt="a8f35a9d-29d1-4a3c-ae98-4c4a87e71c1d-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">压测结果：</p>
<p dir="auto">对api/pic 测试 给接口是返回一张图片<br />
<img src="/assets/uploads/files/1770194340423-dd3fe72b-3b64-4e04-8786-84498286286f-image-resized.png" alt="dd3fe72b-3b64-4e04-8786-84498286286f-image.png" class=" img-fluid img-markdown" /></p>
<p dir="auto">网页访问：<br />
<img src="/assets/uploads/files/1770195692035-8ebacd02-fef5-4cfa-bbc5-61f575de4198-image.png" alt="8ebacd02-fef5-4cfa-bbc5-61f575de4198-image.png" class=" img-fluid img-markdown" /><br />
压测结果：</p>
<p dir="auto"><img src="/assets/uploads/files/1770194311493-149852d2-c08d-466d-9d7e-c00547fa34ce-image-resized.png" alt="149852d2-c08d-466d-9d7e-c00547fa34ce-image.png" class=" img-fluid img-markdown" /><br />
总结</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>：</th>
<th>C++特性</th>
<th>代码示例</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>#pragma once</code></td>
<td><code>#pragma once</code></td>
</tr>
<tr>
<td>CRTP模板继承</td>
<td><code>class X : public drogon::HttpController&lt;X&gt;</code></td>
</tr>
<tr>
<td><code>auto</code> 自动推导</td>
<td><code>auto resp = HttpResponse::newHttpResponse();</code></td>
</tr>
<tr>
<td>右值引用 <code>&amp;&amp;</code></td>
<td><code>std::function&lt;void(const T&amp;)&gt;&amp;&amp; callback</code></td>
</tr>
<tr>
<td><code>std::function</code></td>
<td><code>std::function&lt;void(const HttpResponsePtr&amp;)&gt;</code></td>
</tr>
<tr>
<td>智能指针</td>
<td><code>HttpRequestPtr</code>, <code>HttpResponsePtr</code></td>
</tr>
<tr>
<td><code>const</code> 成员函数</td>
<td><code>void getPic(...) const</code></td>
</tr>
<tr>
<td>C++调用C接口</td>
<td><code>stat(path.c_str(), &amp;buffer)</code></td>
</tr>
</tbody>
</table>
<p dir="auto">​</p>
]]></description><link>http://forum.d2learn.org/topic/164/在linux环境下创建c-drogon-项目-进行接口测试-项目推动型学习</link><guid isPermaLink="true">http://forum.d2learn.org/topic/164/在linux环境下创建c-drogon-项目-进行接口测试-项目推动型学习</guid><dc:creator><![CDATA[abbkirito]]></dc:creator><pubDate>Wed, 04 Feb 2026 09:50:08 GMT</pubDate></item><item><title><![CDATA[讨论: 现代C++编码&#x2F;项目风格]]></title><description><![CDATA[<p dir="auto">目前社区准备制作一份 现代C++ (特别是模块化) 相关的编码和项目组织结构方面的风格参考项目, 例如 模块和头文件兼容、命名风格、接口导出、以及常用技巧的"最佳"实践等.....</p>
<p dir="auto"><strong>欢迎大家在这里交流、讨论、反馈</strong></p>
<ul>
<li><a href="https://github.com/mcpp-community/mcpp-style-ref" rel="nofollow ugc">https://github.com/mcpp-community/mcpp-style-ref</a></li>
</ul>
<p dir="auto"><img src="/assets/uploads/files/1770186717105-0fc7c94b-4e00-4c33-ba5b-65d7967597fc-image.png" alt="0fc7c94b-4e00-4c33-ba5b-65d7967597fc-image.png" class=" img-fluid img-markdown" /></p>
]]></description><link>http://forum.d2learn.org/topic/163/讨论-现代c-编码-项目风格</link><guid isPermaLink="true">http://forum.d2learn.org/topic/163/讨论-现代c-编码-项目风格</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Wed, 04 Feb 2026 06:36:12 GMT</pubDate></item><item><title><![CDATA[[windows系统][环境配置]: d2mcpp项目, 配置完环境，打开是英文的, 如何配置中文?]]></title><description><![CDATA[<p dir="auto">最新版本该问题已经解决</p>

获取d2mcpp最新代码
更新d2x到最新版本

xim --update index
xlings update d2x

]]></description><link>http://forum.d2learn.org/topic/161/windows系统-环境配置-d2mcpp项目-配置完环境-打开是英文的-如何配置中文</link><guid isPermaLink="true">http://forum.d2learn.org/topic/161/windows系统-环境配置-d2mcpp项目-配置完环境-打开是英文的-如何配置中文</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Mon, 02 Feb 2026 02:37:31 GMT</pubDate></item><item><title><![CDATA[C++学习资料开源]]></title><description><![CDATA[<p dir="auto">由于时间不多，来不及更新帖子，现已将部分C++资料上传github（因为平时习惯不好，归档分类有点乱）<br />
<a href="https://github.com/liuguoqingdq/C-Line" rel="nofollow ugc">https://github.com/liuguoqingdq/C-Line</a><br />
内容中有不正确的地方还望指正</p>
]]></description><link>http://forum.d2learn.org/topic/160/c-学习资料开源</link><guid isPermaLink="true">http://forum.d2learn.org/topic/160/c-学习资料开源</guid><dc:creator><![CDATA[月仁不吃五饼]]></dc:creator><pubDate>Wed, 28 Jan 2026 11:09:36 GMT</pubDate></item><item><title><![CDATA[mcpp-sytle-ref: 现代C++编码&#x2F;项目风格参考 | Modern&#x2F;Module C++ Style Reference]]></title><description><![CDATA[<p dir="auto">@Phtato 目前默认是模块化的写法, 20之前的话 可以参考 google-style/cpp</p>
<p dir="auto">社区有个主要的任务的推模块化库和相关工具链使用和普及</p>
]]></description><link>http://forum.d2learn.org/topic/159/mcpp-sytle-ref-现代c-编码-项目风格参考-modern-module-c-style-reference</link><guid isPermaLink="true">http://forum.d2learn.org/topic/159/mcpp-sytle-ref-现代c-编码-项目风格参考-modern-module-c-style-reference</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Mon, 26 Jan 2026 17:12:36 GMT</pubDate></item></channel></rss>