<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Software-Engineering on Blog</title><link>https://blog.sivn.net.cn/categories/software-engineering/</link><description>Recent content in Software-Engineering on Blog</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Tue, 28 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.sivn.net.cn/categories/software-engineering/index.xml" rel="self" type="application/rss+xml"/><item><title>cpp静态变量初始化</title><link>https://blog.sivn.net.cn/post/cppstaticvariableinit/</link><pubDate>Tue, 28 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppstaticvariableinit/</guid><description>&lt;h2 id="类的成员变量"&gt;类的成员变量
&lt;/h2&gt;&lt;h3 id="外部"&gt;外部
&lt;/h3&gt;&lt;p&gt;hpp里定义，然后cpp里初始化，这个是最常用的，就不列举了。&lt;/p&gt;
&lt;h3 id="内联变量-inline"&gt;内联变量 inline
&lt;/h3&gt;&lt;p&gt;C++ 17 引入， 使用 inline 关键字声明的变量可以在多个翻译单元中定义&lt;/p&gt;
&lt;p&gt;可以直接写类里面，也可以在类外初始化。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Example&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;inline&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Example&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;inline&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; Example&lt;span style="color:#f92672"&gt;::&lt;/span&gt;a &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;以上两种方式主要是为了在头文件初始化变量。&lt;/p&gt;</description></item><item><title>PyThreadLock</title><link>https://blog.sivn.net.cn/post/pythreadlock/</link><pubDate>Wed, 15 Apr 2026 10:30:52 +0800</pubDate><guid>https://blog.sivn.net.cn/post/pythreadlock/</guid><description>&lt;h2 id="raii"&gt;RAII
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; threading
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;lock &lt;span style="color:#f92672"&gt;=&lt;/span&gt; threading&lt;span style="color:#f92672"&gt;.&lt;/span&gt;Lock()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;with&lt;/span&gt; lock:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CppTemplate</title><link>https://blog.sivn.net.cn/post/cpptemplate/</link><pubDate>Thu, 09 Apr 2026 15:11:35 +0800</pubDate><guid>https://blog.sivn.net.cn/post/cpptemplate/</guid><description>&lt;h2 id="避免嵌套"&gt;避免嵌套
&lt;/h2&gt;&lt;p&gt;应当避免反复对模板函数进行嵌套&lt;/p&gt;</description></item><item><title>PyIssue</title><link>https://blog.sivn.net.cn/post/pyissue/</link><pubDate>Wed, 01 Apr 2026 08:30:24 +0800</pubDate><guid>https://blog.sivn.net.cn/post/pyissue/</guid><description>&lt;h2 id="文件重名"&gt;文件重名
&lt;/h2&gt;&lt;p&gt;给py文件起名需要非常谨慎
重名会导致严重问题
比如我给一个文件起名openai，但是有叫openai的包，或者其他包里面也有个叫这个的文件，就会导致引用错误&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Traceback (most recent call last):
 File &amp;#34;~/src/chroma.py&amp;#34;, line 5, in &amp;lt;module&amp;gt;
 openai_ef = embedding_functions.OpenAIEmbeddingFunction(
 api_key_env_var=KEY,
 api_base=BASE_URL,
 )
 File &amp;#34;~/python3/lib/python3.13/site-packages/chromadb/utils/embedding_functions/openai_embedding_function.py&amp;#34;, line 47, in __init__
 import openai
 File &amp;#34;/www/qqbot/src/openai.py&amp;#34;, line 28, in &amp;lt;module&amp;gt;
 ENDPOINT = os.environ[&amp;#34;AI_ENDPOINT&amp;#34;]
 ~~~~~~~~~~^^^^^^^^^^^^^^^
 File &amp;#34;&amp;lt;frozen os&amp;gt;&amp;#34;, line 717, in __getitem__
KeyError: &amp;#39;AI_ENDPOINT&amp;#39;
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title>虚函数与纯虚函数</title><link>https://blog.sivn.net.cn/post/cppvirtual/</link><pubDate>Thu, 12 Mar 2026 19:37:40 +0800</pubDate><guid>https://blog.sivn.net.cn/post/cppvirtual/</guid><description>
 &lt;blockquote&gt;
 &lt;p&gt;定义一个函数为虚函数，不代表函数为不被实现的函数。 定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。 定义一个函数为纯虚函数，才代表函数没有被实现。 定义纯虚函数是为了实现一个接口，起到一个规范的作用，规范继承这个类的程序员必须实现这个函数。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;h2 id="纯虚函数"&gt;纯虚函数
&lt;/h2&gt;&lt;p&gt;含有纯虚函数的类即为抽象类，不可实例化&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;virtual&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;funtion1&lt;/span&gt;()&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重写可以改变访问修饰。&lt;/p&gt;
&lt;p&gt;纯虚函数在基类无所谓访问修饰，因为其在必须在子类定义(重写)。&lt;/p&gt;</description></item><item><title>CppModules</title><link>https://blog.sivn.net.cn/post/cppmodules/</link><pubDate>Sat, 14 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppmodules/</guid><description>&lt;h2 id="什么是模块"&gt;什么是模块
&lt;/h2&gt;&lt;p&gt;Cpp20新加的这个功能，更像是用于制作单个动态库，标注动态库的接口&lt;/p&gt;
&lt;h3 id="简单示例"&gt;简单示例
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// math.cppm（模块接口文件）
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; module math;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; b) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; a &lt;span style="color:#f92672"&gt;+&lt;/span&gt; b;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// main.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;import math; &lt;span style="color:#75715e"&gt;// 只导入编译好的二进制接口
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; add(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="示例cpptrace模块"&gt;示例：cpptrace模块
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;module;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;cpptrace/basic.hpp&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;cpptrace/cpptrace.hpp&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;cpptrace/exceptions.hpp&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;cpptrace/formatting.hpp&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;cpptrace/forward.hpp&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;cpptrace/from_current.hpp&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; module cpptrace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CPPTRACE_BEGIN_NAMESPACE
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/basic
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;raw_trace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;object_frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;object_trace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nullable;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stacktrace_frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stacktrace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;generate_raw_trace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;generate_object_trace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;generate_trace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;safe_generate_raw_trace;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;safe_object_frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;can_get_safe_object_frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;can_signal_safe_unwind;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;can_get_safe_object_frame;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;register_jit_object;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;unregister_jit_object;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;clear_all_jit_objects;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/exceptions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;exception;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;lazy_exception;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;exception_with_message;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;logic_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;domain_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;invalid_argument;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;length_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;out_of_range;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;runtime_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;range_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;overflow_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;underflow_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nested_exception;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;system_error;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;rethrow_and_wrap_if_needed;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/formatting
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;basename;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;prettify_symbol;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;formatter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;get_default_formatter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/forward
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;frame_ptr;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/from_current.hpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;raw_trace_from_current_exception;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;from_current_exception;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;raw_trace_from_current_exception_rethrow;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;from_current_exception_rethrow;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;current_exception_was_rethrown;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;rethrow;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;clear_current_exception_traces;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;try_catch;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; detail {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#ifdef _MSC_VER
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;detail&lt;span style="color:#f92672"&gt;::&lt;/span&gt;argument;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;detail&lt;span style="color:#f92672"&gt;::&lt;/span&gt;exception_filter;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#else
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;detail&lt;span style="color:#f92672"&gt;::&lt;/span&gt;unwind_interceptor;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;detail&lt;span style="color:#f92672"&gt;::&lt;/span&gt;unwind_interceptor_for;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;detail&lt;span style="color:#f92672"&gt;::&lt;/span&gt;nop;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/io
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;operator&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// FIXME: make hidden friend
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// cpptrace/utils
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;demangle;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;prune_symbol;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;get_snippet;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;isatty;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stdin_fileno;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stderr_fileno;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;stdout_fileno;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;register_terminate_handler;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;absorb_trace_exceptions;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;enable_inlined_call_resolution;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cache_mode;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;log_level;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;set_log_level;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;set_log_callback;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;use_default_stderr_logger;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;to_string;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cache_mode;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; experimental {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;experimental&lt;span style="color:#f92672"&gt;::&lt;/span&gt;set_cache_mode;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;experimental&lt;span style="color:#f92672"&gt;::&lt;/span&gt;set_dwarf_resolver_line_table_cache_size;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;experimental&lt;span style="color:#f92672"&gt;::&lt;/span&gt;set_dwarf_resolver_disable_aranges;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#ifdef _WIN32
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; cpptrace&lt;span style="color:#f92672"&gt;::&lt;/span&gt;load_symbols_for_file;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#endif
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;CPPTRACE_END_NAMESPACE
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="cmake"&gt;CMake
&lt;/h2&gt;&lt;h3 id="基础"&gt;基础
&lt;/h3&gt;&lt;p&gt;见 &lt;a class="link" href="https://github.com/krisfur/cpp26-modules-template" target="_blank" rel="noopener"
 &gt;https://github.com/krisfur/cpp26-modules-template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;例来自https://cryos.net/2024/01/c-modules-and-cmake&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmake" data-lang="cmake"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_library(&lt;span style="color:#e6db74"&gt;core&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;target_sources(&lt;span style="color:#e6db74"&gt;core&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;PUBLIC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;FILE_SET&lt;/span&gt; &lt;span style="color:#e6db74"&gt;CXX_MODULES&lt;/span&gt; &lt;span style="color:#e6db74"&gt;FILES&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;core.cpp&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_executable(&lt;span style="color:#e6db74"&gt;angohr&lt;/span&gt; &lt;span style="color:#e6db74"&gt;angohr.cpp&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;target_link_libraries(&lt;span style="color:#e6db74"&gt;angohr&lt;/span&gt; &lt;span style="color:#e6db74"&gt;PRIVATE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;core&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="关于-import-std"&gt;关于 import std;
&lt;/h3&gt;&lt;p&gt;CMake 4.3 已经不需要&lt;code&gt;CMAKE_EXPERIMENTAL_CXX_IMPORT_STD&lt;/code&gt;来启用这个功能
(&lt;a class="link" href="https://github.com/Kitware/CMake/commit/70c1f0f43d48c8b3332ce6b3683d8e5cfb5d90e4" target="_blank" rel="noopener"
 &gt;https://github.com/Kitware/CMake/commit/70c1f0f43d48c8b3332ce6b3683d8e5cfb5d90e4&lt;/a&gt;)&lt;/p&gt;

 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;The experimental gate for C++23&amp;rsquo;s &lt;code&gt;import std&lt;/code&gt; has been dropped.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;Variable :variable:&lt;code&gt;CMAKE_CXX_MODULE_STD&lt;/code&gt; and property target
:prop_tgt:&lt;code&gt;CXX_MODULE_STD&lt;/code&gt; control the availability of &lt;code&gt;import std&lt;/code&gt; for
C++ targets.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;Read-only variable :variable:&lt;code&gt;CMAKE_CXX_COMPILER_IMPORT_STD&lt;/code&gt; lists the C++
standard levels for which &lt;code&gt;import std&lt;/code&gt; is available on the current
toolchain.&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;

 &lt;blockquote&gt;
 &lt;ul&gt;
&lt;li&gt;Variable :variable:&lt;code&gt;CMAKE_CXX_STDLIB_MODULES_JSON&lt;/code&gt; sets a specific module
metadata file which CMake will use for constructing &lt;code&gt;import std&lt;/code&gt; instead
of relying on automatic detection via the current C++ compiler.:&lt;/li&gt;
&lt;/ul&gt;

 &lt;/blockquote&gt;</description></item><item><title>CppStacktrace</title><link>https://blog.sivn.net.cn/post/cppstacktrace/</link><pubDate>Sat, 14 Feb 2026 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppstacktrace/</guid><description>&lt;p&gt;Cpp23新增了栈追踪，不确定性能如何。&lt;/p&gt;
&lt;p&gt;感觉是不如cpptrace&lt;/p&gt;</description></item><item><title>CppOperator</title><link>https://blog.sivn.net.cn/post/cppoperator/</link><pubDate>Mon, 20 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppoperator/</guid><description>&lt;h2 id="operators"&gt;operator&amp;quot;&amp;ldquo;s
&lt;/h2&gt;&lt;p&gt;该运算符必须声明（定义）于命名空间或全局域内。&lt;/p&gt;</description></item><item><title>CppDefault</title><link>https://blog.sivn.net.cn/post/cppdefault/</link><pubDate>Sun, 19 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppdefault/</guid><description>&lt;h2 id="default-关键词"&gt;Default 关键词
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ss&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ss() {};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; m_num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;cc&lt;/span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; cc() &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;private&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; m_num;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;实际上default和空函数不大一样。 default通常和不写是等同的&lt;/p&gt;</description></item><item><title>PyIterator</title><link>https://blog.sivn.net.cn/post/pyiterator/</link><pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/pyiterator/</guid><description>&lt;h2 id="next"&gt;next
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;next()&lt;/code&gt; 是一个内置函数，用于从迭代器中获取下一个元素。&lt;/p&gt;
&lt;p&gt;例：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;selected_value &lt;span style="color:#f92672"&gt;=&lt;/span&gt; next(q[&lt;span style="color:#e6db74"&gt;&amp;#34;value&amp;#34;&lt;/span&gt;] &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; q &lt;span style="color:#f92672"&gt;in&lt;/span&gt; local_users &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; q[&lt;span style="color:#e6db74"&gt;&amp;#34;title&amp;#34;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; user_item)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;而 &lt;code&gt;next()&lt;/code&gt; 在这里的作用就是从这个生成器表达式中获取第一个满足条件的 &lt;code&gt;q[&amp;quot;value&amp;quot;]&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>PyNone</title><link>https://blog.sivn.net.cn/post/pynone/</link><pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/pynone/</guid><description>&lt;h2 id="none"&gt;None
&lt;/h2&gt;&lt;p&gt;类似于其他语言的NULL，不过None是一种特殊的值，类型是Nonetype&lt;/p&gt;</description></item><item><title>CppSwitch</title><link>https://blog.sivn.net.cn/post/cppswitch/</link><pubDate>Fri, 10 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppswitch/</guid><description>&lt;h2 id="范围-case"&gt;范围 case
&lt;/h2&gt;&lt;p&gt;部分编译器支持 &lt;code&gt;case x ... y&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;这是编译器扩展。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;switch&lt;/span&gt; (c) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;0&amp;#39;&lt;/span&gt; ... &lt;span style="color:#e6db74"&gt;&amp;#39;9&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;case&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Cpp Inline 关键词</title><link>https://blog.sivn.net.cn/post/cppinline/</link><pubDate>Fri, 19 Sep 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppinline/</guid><description>&lt;h2 id="避免odr"&gt;避免ODR
&lt;/h2&gt;&lt;p&gt;inline 的核心作用是告诉编译器 “允许函数在多个翻译单元中存在相同定义”（解决 ODR 问题）&lt;/p&gt;
&lt;h2 id="内联函数"&gt;内联函数
&lt;/h2&gt;&lt;h3 id="作用"&gt;作用
&lt;/h3&gt;&lt;p&gt;类似宏，进行文本替换。节省栈内存空间消耗。&lt;/p&gt;
&lt;h3 id="限制"&gt;限制
&lt;/h3&gt;
 &lt;blockquote&gt;
 &lt;p&gt;inline 的使用是有所限制的，inline 只适合涵数体内代码简单的函数使用，不能包含复杂的结构控制语句例如 while、switch，并且不能内联函数本身不能是直接递归函数（即，自己内部还调用自己的函数）。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;推荐用于Getter, Setter&lt;/p&gt;
&lt;h3 id="inline位置"&gt;inline位置
&lt;/h3&gt;&lt;p&gt;定义在类中的成员函数默认都是内联的。&lt;/p&gt;
&lt;p&gt;在x86-64 clang 21.1.0测试 inline关键词只要在声明或定义中有一处标识即可。 这与下方链接矛盾。&lt;/p&gt;
&lt;p&gt;不过通常inline只写在定义上，且&lt;strong&gt;定义直接放在头文件&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id="链接"&gt;链接
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.runoob.com/w3cnote/cpp-inline-usage.html" target="_blank" rel="noopener"
 &gt;runoob&lt;/a&gt;&lt;/p&gt;</description></item><item><title>cpp Static 关键词</title><link>https://blog.sivn.net.cn/post/cppstatic/</link><pubDate>Mon, 12 May 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppstatic/</guid><description>&lt;h2 id="全局"&gt;全局
&lt;/h2&gt;&lt;p&gt;对于全局变量来说，&lt;code&gt;static&lt;/code&gt; 关键词只改变其作用域。&lt;/p&gt;
&lt;h2 id="静态"&gt;静态
&lt;/h2&gt;&lt;p&gt;全局静态变量或函数具有内部链接（&lt;code&gt;internal linkage&lt;/code&gt;），这意味着它只能在定义它的源文件内部被访问。 编译器会将静态函数的符号限制在源文件内部，不会生成全局符号。&lt;/p&gt;
&lt;h2 id="普通"&gt;普通
&lt;/h2&gt;&lt;p&gt;普通全局变量具有外部链接（&lt;code&gt;external linkage&lt;/code&gt;），这意味着它可以在多个源文件中被访问。它的作用域是整个程序，只要在其他文件中使用 &lt;code&gt;extern&lt;/code&gt; 声明，就可以访问该变量。&lt;/p&gt;</description></item><item><title>C++报错</title><link>https://blog.sivn.net.cn/post/cpperror/</link><pubDate>Tue, 29 Apr 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cpperror/</guid><description>&lt;h2 id="未定义引用-undefined-reference"&gt;未定义引用 undefined reference
&lt;/h2&gt;&lt;h2 id="模板函数-template-function"&gt;模板函数 template function
&lt;/h2&gt;&lt;p&gt;模板函数需要定义必须在头文件，不能拆成cpp和hpp&lt;/p&gt;
&lt;h2 id="静态变量"&gt;静态变量
&lt;/h2&gt;&lt;p&gt;静态变量要初始化&lt;/p&gt;
&lt;h2 id="成员初始化错误-mem_init_not_member_or_class"&gt;成员初始化错误 mem_init_not_member_or_class
&lt;/h2&gt;&lt;p&gt;子类无法使用成员初始器初始化继承的成员。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Shape&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;protected&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; radius;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Ball&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; Shape {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Ball(&lt;span style="color:#66d9ef"&gt;double&lt;/span&gt; r) &lt;span style="color:#f92672"&gt;:&lt;/span&gt; radius(r) {} &lt;span style="color:#75715e"&gt;//error
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Member initializer &amp;#39;radius&amp;#39; does not name a non-static data member or base class (clang mem_init_not_member_or_class)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>CPP语法：类型</title><link>https://blog.sivn.net.cn/post/cpptype/</link><pubDate>Mon, 28 Apr 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cpptype/</guid><description>&lt;h2 id="关键词"&gt;关键词
&lt;/h2&gt;&lt;h3 id="typedef旧式类型别名定义"&gt;typedef（旧式类型别名定义）
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;typedef&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; Integer;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="using-新式类型别名定义和类型推导"&gt;using （新式类型别名定义和类型推导）
&lt;/h3&gt;&lt;p&gt;类型别名定义&lt;/p&gt;
&lt;p&gt;C++ 11 后，&lt;code&gt;using&lt;/code&gt; 可以用于定义类型别名，与 &lt;code&gt;typedef&lt;/code&gt; 类似。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Integer &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;可以做到 &lt;code&gt;typedef&lt;/code&gt; 无法做到的&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;template&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;typename&lt;/span&gt; T&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; Ptr &lt;span style="color:#f92672"&gt;=&lt;/span&gt; T&lt;span style="color:#f92672"&gt;*&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// use
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Ptr&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt; p;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// =
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt;&lt;span style="color:#f92672"&gt;*&lt;/span&gt; p;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="decltype"&gt;decltype
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;decltype&lt;/code&gt; 用于获取表达式的类型。 可以做到类似 &lt;code&gt;template&lt;/code&gt; 的效果。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; x &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;decltype&lt;/span&gt;(x) y &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="右值标识"&gt;右值标识
&lt;/h2&gt;&lt;h3 id="unsigned"&gt;unsigned
&lt;/h3&gt;&lt;p&gt;u 或 U&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0x7fu&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="float"&gt;float
&lt;/h3&gt;&lt;p&gt;f 或 F&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0.3f&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="char8_t--char16_t--char32_t"&gt;char8_t / char16_t / char32_t
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char8_t&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; u8&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char16_t&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; u16&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;char32_t&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; u32&lt;span style="color:#e6db74"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>C++函数重载(Overloading)</title><link>https://blog.sivn.net.cn/post/cppfunctionoverloading/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppfunctionoverloading/</guid><description>&lt;h2 id="重载-overloading"&gt;重载 (Overloading)
&lt;/h2&gt;&lt;p&gt;(热知识)&lt;/p&gt;
&lt;p&gt;只改变参数标识符不形成重载&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a); &lt;span style="color:#75715e"&gt;//function cannot be redeclared
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参数的修饰词不形成重构&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; t);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Set&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a); &lt;span style="color:#75715e"&gt;//function cannot be redeclared
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但是函数修饰const会形成重构&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Get&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; t) &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Get&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; t);
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>cpp变量的链接属性</title><link>https://blog.sivn.net.cn/post/cppvariablelinkage/</link><pubDate>Thu, 03 Apr 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cppvariablelinkage/</guid><description>&lt;p&gt;非 &lt;code&gt;const&lt;/code&gt; 的全局变量默认具有 &lt;code&gt;外部链接(external linkage)&lt;/code&gt; ，它们可以在多个 &lt;strong&gt;翻译单元(源文件)&lt;/strong&gt; 之间共享。 而 &lt;code&gt;const&lt;/code&gt; 变量默认具有 &lt;code&gt;内部链接(internal linkage)&lt;/code&gt;，即它们只能在定义它们的 &lt;code&gt;翻译单元&lt;/code&gt; 内访问。&lt;/p&gt;
&lt;h2 id="非-const-全局变量的默认外部链接"&gt;非 const 全局变量的默认外部链接
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 文件：file1.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; globalVar &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;42&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 默认外部链接，可以在其他文件中访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printGlobalVar&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;globalVar: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; globalVar &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 文件：file2.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; globalVar; &lt;span style="color:#75715e"&gt;// 声明 globalVar
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printGlobalVarFromAnotherFile&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;globalVar: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; globalVar &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl; &lt;span style="color:#75715e"&gt;// 链接成功
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="const-全局变量的默认内部链接"&gt;const 全局变量的默认内部链接
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 文件：file1.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; MAX_SIZE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 默认内部链接，仅在 file1.cpp 中可见
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printMaxSize&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;MAX_SIZE: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; MAX_SIZE &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 文件：file2.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; MAX_SIZE; &lt;span style="color:#75715e"&gt;// 声明 MAX_SIZE，但链接失败
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printMaxSizeFromAnotherFile&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;MAX_SIZE: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; MAX_SIZE &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl; &lt;span style="color:#75715e"&gt;// 链接错误
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="让-const-变量具有外部链接"&gt;让 const 变量具有外部链接
&lt;/h2&gt;&lt;p&gt;使用 &lt;code&gt;extern&lt;/code&gt; 关键字来改变其链接属性。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 文件：file1.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; MAX_SIZE &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 外部链接，可以在其他文件中访问
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printMaxSize&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;MAX_SIZE: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; MAX_SIZE &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// 文件：file2.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;extern&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; MAX_SIZE; &lt;span style="color:#75715e"&gt;// 声明 MAX_SIZE
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;printMaxSizeFromAnotherFile&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;cout &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;MAX_SIZE: &amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; MAX_SIZE &lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&lt;/span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;endl; &lt;span style="color:#75715e"&gt;// 链接成功
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>cpp-CMake项目管理</title><link>https://blog.sivn.net.cn/post/cmakeproject/</link><pubDate>Mon, 24 Mar 2025 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/cmakeproject/</guid><description>&lt;h2 id="工程文件结构示例"&gt;工程文件结构示例
&lt;/h2&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;Project
├── .git/
├── .github/
│ └── workflows/
├── assets/
├── attic/
├── cmake/
├── doc/
├── lib/
├── scripts/
├── source/
│ ├── application/
│ │ ├── CMakeLists.txt
│ │ ├── XXApplication.cpp
│ │ └── XXApplication.hpp
│ ├── base/
│ ├── core/
│ ├── extern/
│ ├── test/
│ ├── utility/
│ ├── CMakeLists.txt
│ ├── CMakePresets.json
│ ├── vcpkg-configuration.json
│ └── vcpkg.json
├── toolchains/
├── triplets/
├── .clang-format
├── .gitattributes
├── .gitignore
└── README.md
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;source内的每个文件夹都是一个lib或exe，内容都与application类似，就不重复列举了。&lt;/p&gt;
&lt;h2 id="变量"&gt;变量
&lt;/h2&gt;&lt;p&gt;不喜欢定义大量变量，可以用递归赋值&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmake" data-lang="cmake"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set(&lt;span style="color:#e6db74"&gt;sint_application_SOURCESS&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;XXApplication.cpp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#P2P
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set(&lt;span style="color:#e6db74"&gt;sint_application_SOURCES&lt;/span&gt; &lt;span style="color:#f92672"&gt;${&lt;/span&gt;star_application_HEADERS&lt;span style="color:#f92672"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;P2PNet.cpp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; )&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="头文件搜索路径"&gt;头文件搜索路径
&lt;/h2&gt;&lt;p&gt;基本就一点&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmake" data-lang="cmake"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set(&lt;span style="color:#e6db74"&gt;SINT_GRAPHCS_INCLUDES&lt;/span&gt; &lt;span style="color:#f92672"&gt;${&lt;/span&gt;PROJECT_SOURCE_DIR&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/graphics&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_subdirectory(&lt;span style="color:#e6db74"&gt;graphics&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;target_include_directories(&lt;span style="color:#e6db74"&gt;test&lt;/span&gt; &lt;span style="color:#e6db74"&gt;PRIVATE&lt;/span&gt; &lt;span style="color:#f92672"&gt;${&lt;/span&gt;SINT_GRAPHCS_INCLUDES&lt;span style="color:#f92672"&gt;}&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;要注意的是&lt;/p&gt;
&lt;p&gt;必须先设置(set)变量，再添加子目录(add_subdirectory) &lt;code&gt;target_include_directories&lt;/code&gt; 参数3必须是路径，不能用变量&lt;/p&gt;
&lt;h2 id="object-库"&gt;OBJECT 库
&lt;/h2&gt;
 &lt;blockquote&gt;
 &lt;p&gt;&lt;code&gt;add_library(&amp;lt;name&amp;gt; [STATIC | SHARED | OBJECT] source2 [source2 ...])&lt;/code&gt; 创建对象库。对象库不会生成一个单独的库文件，而是生成一系列对象文件（.o 或 .obj 文件）。 这些对象文件可以在后续的构建目标中被重用，例如同时构建静&amp;gt;态库和动态库。&lt;/p&gt;

 &lt;/blockquote&gt;
&lt;p&gt;推荐使用OBJECT库。&lt;/p&gt;
&lt;p&gt;通用函数，如读取文件等， 可以作为OBJECT库保存，而不是STATIC或SHARED，这两种会生成为一个单独的文件。&lt;/p&gt;
&lt;h3 id="使用"&gt;使用：
&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmake" data-lang="cmake"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;add_executable(&lt;span style="color:#e6db74"&gt;my_app&lt;/span&gt; &lt;span style="color:#e6db74"&gt;main.cpp&lt;/span&gt; &lt;span style="color:#f92672"&gt;$&amp;lt;&lt;/span&gt;TARGET_OBJECTS:common&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="输出运行文件到指定目录"&gt;输出运行文件到指定目录
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cmake" data-lang="cmake"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set(&lt;span style="color:#e6db74"&gt;CMAKE_RUNTIME_OUTPUT_DIRECTORY&lt;/span&gt; &lt;span style="color:#f92672"&gt;${&lt;/span&gt;PROJECT_SOURCE_DIR&lt;span style="color:#f92672"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/../dist&lt;/span&gt;)&lt;span style="color:#960050;background-color:#1e0010"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="其他链接"&gt;其他链接
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.yuque.com/softdev/cmake" target="_blank" rel="noopener"
 &gt;yuque&lt;/a&gt;&lt;/p&gt;</description></item><item><title>C#笔记</title><link>https://blog.sivn.net.cn/post/csharpnote/</link><pubDate>Fri, 16 Aug 2024 00:00:00 +0000</pubDate><guid>https://blog.sivn.net.cn/post/csharpnote/</guid><description>&lt;h2 id="class"&gt;class
&lt;/h2&gt;&lt;p&gt;在csharp中，类是引用类型，而在cpp 类是值类型&lt;/p&gt;
&lt;h2 id="null"&gt;null!
&lt;/h2&gt;&lt;p&gt;null包容运算符 假定空值，方便在必须始终有值时定义空值。 这玩意就是面向IDE，跳过警告的。&lt;/p&gt;
&lt;h2 id="nameof方法"&gt;nameof方法
&lt;/h2&gt;&lt;p&gt;有什么用？主要用解决 类成员名做参数替代成员们的字符串做参数。 不影响性能，会在编译阶段被替换，因此并不是真正的动态捕捉。 不过比起用字符串来反射强点，毕竟如果名字变了，ide会报错。&lt;/p&gt;</description></item></channel></rss>