tag:github.com,2008:/zigcc/forum/discussions Recent discussions in zigcc/forum 2026-03-19T09:00:43+00:00 tag:github.com,2008:8991619 ✨Zig文件是一个`struct` 2025-10-06T11:17:38+00:00 2026-03-19T09:00:43+00:00 Anglebase https://github.com/Anglebase <h1 dir="auto">奇怪的语法</h1> <p dir="auto">为什么Zig要采用这种看起来十分奇怪的包导入语法?</p> <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const std = @import(&quot;std&quot;);"><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-v">std</span> <span class="pl-k">=</span> <span class="pl-k">@import</span>(<span class="pl-s">"std"</span>);</pre></div> <h1 dir="auto">Zig的设计</h1> <p dir="auto">深入研究了我发现,Zig的文件就是一个<code class="notranslate">struct</code>,所以,以下代码在Zig中是合法的</p> <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const std = @import(&quot;std&quot;); hello: [14:0]u8 = &quot;Hello, world!\n&quot;.*, // What? fn print(self: @This()) void { std.debug.print(&quot;{s}&quot;, .{self.hello}); } pub fn main() void { const this = @This(){}; this.print(); }"><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-v">std</span> <span class="pl-k">=</span> <span class="pl-k">@import</span>(<span class="pl-s">"std"</span>); <span class="pl-smi">hello</span>: [<span class="pl-c1">14</span>:<span class="pl-c1">0</span>]<span class="pl-k">u8</span> <span class="pl-k">=</span> <span class="pl-s">"Hello, world!<span class="pl-cce">\n</span>"</span><span class="pl-k">.*</span>, <span class="pl-c">// What?</span> <span class="pl-k">fn</span> <span class="pl-en">print</span>(<span class="pl-v">self</span>: <span class="pl-c1">@This</span>()) <span class="pl-k">void</span> { <span class="pl-v">std</span>.<span class="pl-v">debug</span>.<span class="pl-v">print</span>(<span class="pl-s">"{s}"</span>, .{<span class="pl-v">self</span>.<span class="pl-v">hello</span>}); } <span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">main</span>() <span class="pl-k">void</span> { <span class="pl-k">const</span> <span class="pl-v">this</span> <span class="pl-k">=</span> <span class="pl-c1">@This</span>(){}; <span class="pl-v">this</span>.<span class="pl-v">print</span>(); }</pre></div> <p dir="auto">这段代码为当前文件所代表的<code class="notranslate">struct</code>定义了一个名为<code class="notranslate">hello</code>的字段,并成功地实例化了自己。</p> <p dir="auto">这就说的通了,包导入不是在导包,而是在定义一个类型,可以近似理解成:</p> <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const std = struct { @cInclude(&quot;std.zig&quot;) };"><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-en">std</span> <span class="pl-k">=</span> <span class="pl-k">struct</span> { <span class="pl-k">@cInclude</span>(<span class="pl-s">"std.zig"</span>) };</pre></div> <blockquote> <p dir="auto">不过Zig没有预处理器,不允许文件直接包含的这种写法</p> </blockquote> <h1 dir="auto">所以</h1> <p dir="auto"><strong>Zig并不存在实质上的包导入语法,而是创造了一个由外部文件定义的类型</strong></p> tag:github.com,2008:7025854 zoop: 一个 Zig 的 OOP 方案 2024-08-08T13:03:10+00:00 2026-03-19T04:38:19+00:00 zhuyadong https://github.com/zhuyadong <p dir="auto">github: <a href="https://github.com/zhuyadong/zoop">https://github.com/zhuyadong/zoop</a></p> tag:github.com,2008:7950251 闲聊一个关于 zig 语法的问题 2025-02-12T03:05:59+00:00 2026-03-19T04:24:12+00:00 aceyin https://github.com/aceyin <p dir="auto">参考下面这段伪代码:</p> <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const TaggedMyStruct = typedef(MyStruct, .Tag{.keyvalue=.{&quot;key&quot;,&quot;myvalue&quot;}}); const TagPayloads = struct{ const tag1 : TypedefConfig.Tag = .Tag{.keyvaluearr=.{.{&quot;key&quot;,&quot;myvalue&quot;}, .{&quot;otherkey&quot;,&quot;othervalue&quot;}}}); } const SecondTaggedMyStruct = typedef(MyStruct, TagPayloads.tag1);"><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-en">TaggedMyStruct</span> <span class="pl-k">=</span> <span class="pl-v">typedef</span>(<span class="pl-en">MyStruct</span>, <span class="pl-c1">.Tag</span>{.<span class="pl-v">keyvalue</span><span class="pl-k">=</span>.{<span class="pl-s">"key"</span>,<span class="pl-s">"myvalue"</span>}}); <span class="pl-k">const</span> <span class="pl-en">TagPayloads</span> <span class="pl-k">=</span> <span class="pl-k">struct</span>{ <span class="pl-k">const</span> <span class="pl-smi">tag1</span> : <span class="pl-k">TypedefConfig.Tag</span> <span class="pl-k">=</span> <span class="pl-c1">.Tag</span>{.<span class="pl-v">keyvaluearr</span><span class="pl-k">=</span>.{.{<span class="pl-s">"key"</span>,<span class="pl-s">"myvalue"</span>}, .{<span class="pl-s">"otherkey"</span>,<span class="pl-s">"othervalue"</span>}}}); } <span class="pl-k">const</span> <span class="pl-en">SecondTaggedMyStruct</span> <span class="pl-k">=</span> <span class="pl-v">typedef</span>(<span class="pl-en">MyStruct</span>, <span class="pl-en">TagPayloads</span>.<span class="pl-v">tag1</span>);</pre></div> <p dir="auto">大家不觉得这一行里面的 n 个 <code class="notranslate">.</code> 号看起来很丑陋吗:</p> <blockquote> <p dir="auto">const tag1 : TypedefConfig.Tag = .Tag{.keyvaluearr=.{.{"key","myvalue"}, .{"otherkey","othervalue"}}});</p> </blockquote> tag:github.com,2008:6930633 微信群 2024-07-14T01:41:59+00:00 2026-03-18T04:47:15+00:00 jiacai2050 https://github.com/jiacai2050 <p dir="auto"><a target="_blank" rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/62087089/565316560-03b57fd5-c4d6-4c32-b233-411458c23e8a.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MTYzMjksIm5iZiI6MTc3MzkxNjAyOSwicGF0aCI6Ii82MjA4NzA4OS81NjUzMTY1NjAtMDNiNTdmZDUtYzRkNi00YzMyLWIyMzMtNDExNDU4YzIzZThhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzE5VDEwMjcwOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNkZjI4ZmYwMzA2MzIxYWNmMGU3YTFjNGQ0ZDZiOTk4M2Q5ODc4OWI0NWY2MGQzOTYyZWZkM2EwZmY4OTEyNDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.caLmGovAjnC_WsUKK6vcQyCtjp0B3Bo2Ox8zLXt1HaI"><img src="https://private-user-images.githubusercontent.com/62087089/565316560-03b57fd5-c4d6-4c32-b233-411458c23e8a.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MTYzMjksIm5iZiI6MTc3MzkxNjAyOSwicGF0aCI6Ii82MjA4NzA4OS81NjUzMTY1NjAtMDNiNTdmZDUtYzRkNi00YzMyLWIyMzMtNDExNDU4YzIzZThhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzE5VDEwMjcwOVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTNkZjI4ZmYwMzA2MzIxYWNmMGU3YTFjNGQ0ZDZiOTk4M2Q5ODc4OWI0NWY2MGQzOTYyZWZkM2EwZmY4OTEyNDImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.caLmGovAjnC_WsUKK6vcQyCtjp0B3Bo2Ox8zLXt1HaI" alt="Screenshot_2026-03-18-12-46-41-795_com.tencent.mm-edit.jpg" style="max-width: 100%;"></a></p> <p dir="auto">如二维码过期,请在此留言,我们会及时更新,谢谢!同时也可以加入我们的电报群:<a href="http://ask.ziglang.cc/telegram" rel="nofollow">http://ask.ziglang.cc/telegram</a></p> <p dir="auto">更多群聊方式见:<a href="https://ziglang.cc/" rel="nofollow">https://ziglang.cc/</a></p> tag:github.com,2008:9545072 使用zig实现了一个类似ls的工具 2026-02-27T12:29:06+00:00 2026-02-27T12:30:55+00:00 here-Leslie-Lau https://github.com/here-Leslie-Lau <p dir="auto">这是我第一个zig项目,主要是拿来学习用的,如果有什么问题欢迎留言</p> <p dir="auto">仓库地址: <a href="https://github.com/here-Leslie-Lau/zlist">https://github.com/here-Leslie-Lau/zlist</a></p> tag:github.com,2008:9469114 Zig构建时使用ReleaseFast卡住 2026-02-13T04:06:19+00:00 2026-02-13T04:51:27+00:00 KarryCharon https://github.com/KarryCharon <h1 dir="auto">环境</h1> <ul dir="auto"> <li>MacOSX 15.3.1</li> <li>Apple M2 Max</li> </ul> <blockquote> <p dir="auto">最小化复现文件: <a href="https://gist.github.com/KarryCharon/6cb0c87e11f77476d5322df35815268f#file-llvm_slow_repro-zig">https://gist.github.com/KarryCharon/6cb0c87e11f77476d5322df35815268f#file-llvm_slow_repro-zig</a><br> 构建指令: <code class="notranslate">zig build-exe llvm_slow_repro.zig -OReleaseFast</code></p> </blockquote> <h1 dir="auto">Note</h1> <ol dir="auto"> <li>仅Release时会卡住, 使用Debug则没问题.</li> <li>更改文件中 <code class="notranslate">const REGISTER_COUNT: usize = 128;</code> 可以通过</li> </ol> <h1 dir="auto">进一步研究结果:</h1> <ol dir="auto"> <li>把144行</li> </ol> <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=" var regs: [REGISTER_COUNT]Value = @splat(Value.nil());"><pre class="notranslate"> <span class="pl-k">var</span> <span class="pl-smi">regs</span>: [<span class="pl-v">REGISTER_COUNT</span>]<span class="pl-k">Value</span> <span class="pl-k">=</span> <span class="pl-c1">@splat</span>(<span class="pl-en">Value</span>.<span class="pl-v">nil</span>());</pre></div> <p dir="auto">换成</p> <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=" var regs: [REGISTER_COUNT]Value = undefined; @memset(regs[0..], Value.nil());"><pre class="notranslate"> <span class="pl-k">var</span> <span class="pl-smi">regs</span>: [<span class="pl-v">REGISTER_COUNT</span>]<span class="pl-k">Value</span> <span class="pl-k">=</span> <span class="pl-c1">undefined</span>; <span class="pl-c1">@memset</span>(<span class="pl-v">regs</span>[0<span class="pl-k">..</span>], <span class="pl-en">Value</span>.<span class="pl-v">nil</span>());</pre></div> <p dir="auto">可以解决</p> tag:github.com,2008:9425686 关于zig “.”点操作符的一些疑惑 2026-02-04T02:21:45+00:00 2026-02-05T01:35:58+00:00 yellowzq https://github.com/yellowzq <p dir="auto">pub fn reader(file: File, buffer: []u8) Reader { return .init(file, buffer); }<br> 大佬们有能解答的么“.”这个点操作符是在哪个命名空间中找的?<br> 怎么会调用Reader的.init?reader不是在File里面吗?官方文件有木有说明在哪?</p> tag:github.com,2008:9214099 感觉zig的defer没有c++的raii和rust的drop好用 2025-12-06T05:33:19+00:00 2026-02-04T05:38:37+00:00 xinyang-go https://github.com/xinyang-go <p dir="auto">该问题主要存在于泛型类中。</p> <p dir="auto">例如容器在deinit的时候没法把保存在容器中的元素也deinit。ArrayList(ArrayList(i32))在defer的时候得手动先把内部deinit再把外部deinit。<br> 虽然可以通过反射判断元素是否存在deinit函数,来选择性deinit元素,但依然存在两个问题:</p> <ul dir="auto"> <li>没有任何语言上的强制性要求,让元素的析构函数名称必须叫deinit。</li> <li>deinit可能需要传参,常见情况是传递一个allocator,但也有可能存在其他传参。</li> </ul> tag:github.com,2008:9255111 msys2安装的zig不使用msys2 2025-12-17T04:39:56+00:00 2026-01-17T04:11:58+00:00 heloonihao https://github.com/heloonihao <p dir="auto">运行<code class="notranslate">zig libc</code>显示</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="$ zig libc # The directory that contains `stdlib.h`. # On POSIX-like systems, include directories be found with: `cc -E -Wp,-v -xc /dev/null` include_dir=D:\Windows Kits\10\Include\10.0.26100.0\ucrt # The system-specific include directory. May be the same as `include_dir`. # On Windows it's the directory that includes `vcruntime.h`. # On POSIX it's the directory that includes `sys/errno.h`. sys_include_dir=D:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717\incl ude # The directory that contains `crt1.o` or `crt2.o`. # On POSIX, can be found with `cc -print-file-name=crt1.o`. # Not needed when targeting MacOS. crt_dir=D:\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64 # The directory that contains `vcruntime.lib`. # Only needed when targeting MSVC on Windows. msvc_lib_dir=D:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717\Lib\x64 # The directory that contains `kernel32.lib`. # Only needed when targeting MSVC on Windows. kernel32_lib_dir=D:\Windows Kits\10\Lib\10.0.26100.0\um\x64 # The directory that contains `crtbeginS.o` and `crtendS.o` # Only needed when targeting Haiku. gcc_dir="><pre lang="log" class="notranslate"><code class="notranslate">$ zig libc # The directory that contains `stdlib.h`. # On POSIX-like systems, include directories be found with: `cc -E -Wp,-v -xc /dev/null` include_dir=D:\Windows Kits\10\Include\10.0.26100.0\ucrt # The system-specific include directory. May be the same as `include_dir`. # On Windows it's the directory that includes `vcruntime.h`. # On POSIX it's the directory that includes `sys/errno.h`. sys_include_dir=D:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717\incl ude # The directory that contains `crt1.o` or `crt2.o`. # On POSIX, can be found with `cc -print-file-name=crt1.o`. # Not needed when targeting MacOS. crt_dir=D:\Windows Kits\10\Lib\10.0.26100.0\ucrt\x64 # The directory that contains `vcruntime.lib`. # Only needed when targeting MSVC on Windows. msvc_lib_dir=D:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717\Lib\x64 # The directory that contains `kernel32.lib`. # Only needed when targeting MSVC on Windows. kernel32_lib_dir=D:\Windows Kits\10\Lib\10.0.26100.0\um\x64 # The directory that contains `crtbeginS.o` and `crtendS.o` # Only needed when targeting Haiku. gcc_dir= </code></pre></div> <p dir="auto">预期应该是使用msys2的头文件和库的目录</p> <p dir="auto">我尝试<code class="notranslate"> zig libc -target x86_64-windows-gnu</code></p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="$ zig libc -target x86_64-windows-gnu error: unable to detect libc for non-native target error: the following build command failed with exit code 1: C:\Users\heloonihao\AppData\Local\zig\o\a1c86a5b85607a86e1df5ddacc7d4773\libc.exe D:\msys64\clang64\ lib\zig -target x86_64-windows-gnu"><pre class="notranslate"><code class="notranslate">$ zig libc -target x86_64-windows-gnu error: unable to detect libc for non-native target error: the following build command failed with exit code 1: C:\Users\heloonihao\AppData\Local\zig\o\a1c86a5b85607a86e1df5ddacc7d4773\libc.exe D:\msys64\clang64\ lib\zig -target x86_64-windows-gnu </code></pre></div> <p dir="auto"><code class="notranslate">zig build -Dtarget=x86_64-windows-gnu</code>也不起作用</p> tag:github.com,2008:9325550 ... 2026-01-09T11:29:40+00:00 2026-01-13T11:39:26+00:00 mono-cyte https://github.com/mono-cyte <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content=" pub const AllocateVirtualMemoryError = error{ AccessDenied, NoMemory, InvalidHandle, Unexpected, }; pub fn VirtualAllocEx( h_process: HANDLE, address: ?*anyopaque, size: usize, alloc_type: u32, protect: u32, ) AllocateVirtualMemoryError!*anyopaque { var base_addr: ?*anyopaque = address; var region_size: usize = size; const status = ntdll.NtAllocateVirtualMemory( h_process, &amp;base_addr, 0, &amp;region_size, alloc_type, protect, ); if (status != .SUCCESS) { return switch (status) { .ACCESS_DENIED =&gt; error.AccessDenied, .NO_MEMORY, .CONFLICTING_ADDRESSES =&gt; error.NoMemory, .INVALID_HANDLE =&gt; error.InvalidHandle, else =&gt; error.Unexpected, }; } if (base_addr) |addr| { return addr; } return error.Unexpected; }"><pre class="notranslate"><span class="pl-k">pub</span> <span class="pl-k">const</span> <span class="pl-en">AllocateVirtualMemoryError</span> <span class="pl-k">=</span> <span class="pl-k">error</span>{ <span class="pl-en">AccessDenied</span>, <span class="pl-en">NoMemory</span>, <span class="pl-en">InvalidHandle</span>, <span class="pl-en">Unexpected</span>, }; <span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">VirtualAllocEx</span>( <span class="pl-v">h_process</span>: <span class="pl-k">HANDLE</span>, <span class="pl-v">address</span>: <span class="pl-k">?</span><span class="pl-k">*</span><span class="pl-k">anyopaque</span>, <span class="pl-v">size</span>: <span class="pl-k">usize</span>, <span class="pl-v">alloc_type</span>: <span class="pl-k">u32</span>, <span class="pl-v">protect</span>: <span class="pl-k">u32</span>, ) <span class="pl-k">AllocateVirtualMemoryError</span><span class="pl-k">!</span><span class="pl-k">*</span><span class="pl-k">anyopaque</span> { <span class="pl-k">var</span> <span class="pl-smi">base_addr</span>: <span class="pl-k">?</span><span class="pl-k">*</span><span class="pl-k">anyopaque</span> <span class="pl-k">=</span> <span class="pl-v">address</span>; <span class="pl-k">var</span> <span class="pl-smi">region_size</span>: <span class="pl-k">usize</span> <span class="pl-k">=</span> <span class="pl-v">size</span>; <span class="pl-k">const</span> <span class="pl-v">status</span> <span class="pl-k">=</span> <span class="pl-v">ntdll</span>.<span class="pl-v">NtAllocateVirtualMemory</span>( <span class="pl-v">h_process</span>, <span class="pl-k">&amp;</span><span class="pl-v">base_addr</span>, <span class="pl-c1">0</span>, <span class="pl-k">&amp;</span><span class="pl-v">region_size</span>, <span class="pl-v">alloc_type</span>, <span class="pl-v">protect</span>, ); <span class="pl-k">if</span> (<span class="pl-v">status</span> <span class="pl-k">!=</span> <span class="pl-c1">.SUCCESS</span>) { <span class="pl-k">return</span> <span class="pl-k">switch</span> (<span class="pl-v">status</span>) { <span class="pl-c1">.ACCESS_DENIED</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> <span class="pl-k">error</span>.<span class="pl-en">AccessDenied</span>, <span class="pl-c1">.NO_MEMORY</span>, <span class="pl-c1">.CONFLICTING_ADDRESSES</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> <span class="pl-k">error</span>.<span class="pl-en">NoMemory</span>, <span class="pl-c1">.INVALID_HANDLE</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> <span class="pl-k">error</span>.<span class="pl-en">InvalidHandle</span>, <span class="pl-k">else</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> <span class="pl-k">error</span>.<span class="pl-en">Unexpected</span>, }; } <span class="pl-k">if</span> (<span class="pl-v">base_addr</span>) <span class="pl-k">|</span><span class="pl-v">addr</span><span class="pl-k">|</span> { <span class="pl-k">return</span> <span class="pl-v">addr</span>; } <span class="pl-k">return</span> <span class="pl-k">error</span>.<span class="pl-en">Unexpected</span>; }</pre></div> <p dir="auto">类似这样的内容直接放在<code class="notranslate">kernel32.zig</code>吗</p> tag:github.com,2008:9235620 有没有人想移植 rustproject 到 zig 里面来? 2025-12-11T01:25:54+00:00 2026-01-02T08:06:16+00:00 jiacai2050 https://github.com/jiacai2050 <p dir="auto"><a href="https://rustprojectprimer.com/" rel="nofollow">https://rustprojectprimer.com/</a></p> <p dir="auto">很不错的项目,对工程开发很有用。</p> tag:github.com,2008:4976258 使用 Zig 实现的 tree 命令 2023-03-18T05:19:06+00:00 2025-12-06T02:42:21+00:00 jiacai2050 https://github.com/jiacai2050 <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const std = @import(&quot;std&quot;); const process = std.process; const fs = std.fs; const mem = std.mem; const VisitedEntry = struct { name: []const u8, level: usize, }; const VisitedList = std.ArrayList(VisitedEntry); pub fn main() anyerror!void { var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); defer arena.deinit(); const allocator = arena.allocator(); const args = try process.argsAlloc(allocator); defer process.argsFree(allocator, args); const root_dir = if (args.len &gt; 1) args[1] else &quot;.&quot;; var visited = VisitedList.init(allocator); try visited.append(.{ .name = root_dir, .level = 0 }); var iter_dir = try fs.cwd().openIterableDir(root_dir, .{}); defer iter_dir.close(); try walk(allocator, &amp;iter_dir, &amp;visited, 1); var writer = std.io.bufferedWriter(std.io.getStdOut().writer()); for (visited.items) |entry| { _ = try writer.write(try makePrefix(allocator, entry.level)); _ = try writer.write(entry.name); _ = try writer.write(&quot;\n&quot;); } try writer.flush(); } fn makePrefix(allocator: std.mem.Allocator, level: usize) ![]const u8 { const prefix = &quot;| &quot;; const base = &quot;|--&quot;; return switch (level) { 0 =&gt; return &quot;&quot;, 1 =&gt; return base, else =&gt; { var out = try allocator.alloc(u8, (level - 1) * prefix.len + base.len); for (0..level - 1) |i| { mem.copy(u8, out[i * prefix.len .. (i + 1) * prefix.len], prefix); } mem.copy(u8, out[(level - 1) * prefix.len .. level * prefix.len], base); return out; }, }; } fn walk( allocator: mem.Allocator, iter_dir: *fs.IterableDir, visited: *VisitedList, level: usize, ) !void { var it = iter_dir.iterate(); while (try it.next()) |entry| { const dupe_name = try allocator.dupe(u8, entry.name); switch (entry.kind) { .Directory =&gt; { try visited.append(.{ .name = dupe_name, .level = level }); var sub_iter_dir = try iter_dir.dir.openIterableDir(entry.name, .{}); defer sub_iter_dir.close(); try walk( allocator, &amp;sub_iter_dir, visited, level + 1, ); }, else =&gt; { try visited.append(.{ .name = dupe_name, .level = level }); }, } } }"><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-v">std</span> <span class="pl-k">=</span> <span class="pl-k">@import</span>(<span class="pl-s">"std"</span>); <span class="pl-k">const</span> <span class="pl-v">process</span> <span class="pl-k">=</span> <span class="pl-v">std</span>.<span class="pl-v">process</span>; <span class="pl-k">const</span> <span class="pl-v">fs</span> <span class="pl-k">=</span> <span class="pl-v">std</span>.<span class="pl-v">fs</span>; <span class="pl-k">const</span> <span class="pl-v">mem</span> <span class="pl-k">=</span> <span class="pl-v">std</span>.<span class="pl-v">mem</span>; <span class="pl-k">const</span> <span class="pl-en">VisitedEntry</span> <span class="pl-k">=</span> <span class="pl-k">struct</span> { <span class="pl-smi">name</span>: []<span class="pl-k">const</span> <span class="pl-k">u8</span>, <span class="pl-smi">level</span>: <span class="pl-k">usize</span>, }; <span class="pl-k">const</span> <span class="pl-en">VisitedList</span> <span class="pl-k">=</span> <span class="pl-v">std</span>.<span class="pl-v">ArrayList</span>(<span class="pl-en">VisitedEntry</span>); <span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">main</span>() <span class="pl-k">anyerror</span><span class="pl-k">!</span><span class="pl-k">void</span> { <span class="pl-k">var</span> <span class="pl-v">arena</span> <span class="pl-k">=</span> <span class="pl-v">std</span>.<span class="pl-v">heap</span>.<span class="pl-en">ArenaAllocator</span>.<span class="pl-v">init</span>(<span class="pl-v">std</span>.<span class="pl-v">heap</span>.<span class="pl-v">page_allocator</span>); <span class="pl-k">defer</span> <span class="pl-v">arena</span>.<span class="pl-v">deinit</span>(); <span class="pl-k">const</span> <span class="pl-v">allocator</span> <span class="pl-k">=</span> <span class="pl-v">arena</span>.<span class="pl-v">allocator</span>(); <span class="pl-k">const</span> <span class="pl-v">args</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">process</span>.<span class="pl-v">argsAlloc</span>(<span class="pl-v">allocator</span>); <span class="pl-k">defer</span> <span class="pl-v">process</span>.<span class="pl-v">argsFree</span>(<span class="pl-v">allocator</span>, <span class="pl-v">args</span>); <span class="pl-k">const</span> <span class="pl-v">root_dir</span> <span class="pl-k">=</span> <span class="pl-k">if</span> (<span class="pl-v">args</span>.<span class="pl-v">len</span> <span class="pl-k">&gt;</span> <span class="pl-c1">1</span>) <span class="pl-v">args</span>[<span class="pl-c1">1</span>] <span class="pl-k">else</span> <span class="pl-s">"."</span>; <span class="pl-k">var</span> <span class="pl-v">visited</span> <span class="pl-k">=</span> <span class="pl-en">VisitedList</span>.<span class="pl-v">init</span>(<span class="pl-v">allocator</span>); <span class="pl-k">try</span> <span class="pl-v">visited</span>.<span class="pl-v">append</span>(.{ .<span class="pl-v">name</span> <span class="pl-k">=</span> <span class="pl-v">root_dir</span>, .<span class="pl-v">level</span> <span class="pl-k">=</span> <span class="pl-c1">0</span> }); <span class="pl-k">var</span> <span class="pl-v">iter_dir</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">fs</span>.<span class="pl-v">cwd</span>().<span class="pl-v">openIterableDir</span>(<span class="pl-v">root_dir</span>, .{}); <span class="pl-k">defer</span> <span class="pl-v">iter_dir</span>.<span class="pl-v">close</span>(); <span class="pl-k">try</span> <span class="pl-v">walk</span>(<span class="pl-v">allocator</span>, <span class="pl-k">&amp;</span><span class="pl-v">iter_dir</span>, <span class="pl-k">&amp;</span><span class="pl-v">visited</span>, <span class="pl-c1">1</span>); <span class="pl-k">var</span> <span class="pl-v">writer</span> <span class="pl-k">=</span> <span class="pl-v">std</span>.<span class="pl-v">io</span>.<span class="pl-v">bufferedWriter</span>(<span class="pl-v">std</span>.<span class="pl-v">io</span>.<span class="pl-v">getStdOut</span>().<span class="pl-v">writer</span>()); <span class="pl-k">for</span> (<span class="pl-v">visited</span>.<span class="pl-v">items</span>) <span class="pl-k">|</span><span class="pl-v">entry</span><span class="pl-k">|</span> { <span class="pl-c1">_</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">writer</span>.<span class="pl-v">write</span>(<span class="pl-k">try</span> <span class="pl-v">makePrefix</span>(<span class="pl-v">allocator</span>, <span class="pl-v">entry</span>.<span class="pl-v">level</span>)); <span class="pl-c1">_</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">writer</span>.<span class="pl-v">write</span>(<span class="pl-v">entry</span>.<span class="pl-v">name</span>); <span class="pl-c1">_</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">writer</span>.<span class="pl-v">write</span>(<span class="pl-s">"<span class="pl-cce">\n</span>"</span>); } <span class="pl-k">try</span> <span class="pl-v">writer</span>.<span class="pl-v">flush</span>(); } <span class="pl-k">fn</span> <span class="pl-en">makePrefix</span>(<span class="pl-v">allocator</span>: <span class="pl-k">std.mem.Allocator</span>, <span class="pl-v">level</span>: <span class="pl-k">usize</span>) <span class="pl-k">!</span>[]<span class="pl-k">const</span> <span class="pl-k">u8</span> { <span class="pl-k">const</span> <span class="pl-v">prefix</span> <span class="pl-k">=</span> <span class="pl-s">"| "</span>; <span class="pl-k">const</span> <span class="pl-v">base</span> <span class="pl-k">=</span> <span class="pl-s">"|--"</span>; <span class="pl-k">return</span> <span class="pl-k">switch</span> (<span class="pl-v">level</span>) { <span class="pl-c1">0</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> <span class="pl-k">return</span> <span class="pl-s">""</span>, <span class="pl-c1">1</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> <span class="pl-k">return</span> <span class="pl-v">base</span>, <span class="pl-k">else</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> { <span class="pl-k">var</span> <span class="pl-v">out</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">allocator</span>.<span class="pl-v">alloc</span>(<span class="pl-k">u8</span>, (<span class="pl-v">level</span> <span class="pl-k">-</span> <span class="pl-c1">1</span>) <span class="pl-k">*</span> <span class="pl-v">prefix</span>.<span class="pl-v">len</span> <span class="pl-k">+</span> <span class="pl-v">base</span>.<span class="pl-v">len</span>); <span class="pl-k">for</span> (0<span class="pl-k">..</span><span class="pl-v">level</span> <span class="pl-k">-</span> <span class="pl-c1">1</span>) <span class="pl-k">|</span><span class="pl-v">i</span><span class="pl-k">|</span> { <span class="pl-v">mem</span>.<span class="pl-v">copy</span>(<span class="pl-k">u8</span>, <span class="pl-v">out</span>[<span class="pl-v">i</span> <span class="pl-k">*</span> <span class="pl-v">prefix</span>.<span class="pl-v">len</span> <span class="pl-k">..</span> (<span class="pl-v">i</span> <span class="pl-k">+</span> <span class="pl-c1">1</span>) <span class="pl-k">*</span> <span class="pl-v">prefix</span>.<span class="pl-v">len</span>], <span class="pl-v">prefix</span>); } <span class="pl-v">mem</span>.<span class="pl-v">copy</span>(<span class="pl-k">u8</span>, <span class="pl-v">out</span>[(<span class="pl-v">level</span> <span class="pl-k">-</span> <span class="pl-c1">1</span>) <span class="pl-k">*</span> <span class="pl-v">prefix</span>.<span class="pl-v">len</span> <span class="pl-k">..</span> <span class="pl-v">level</span> <span class="pl-k">*</span> <span class="pl-v">prefix</span>.<span class="pl-v">len</span>], <span class="pl-v">base</span>); <span class="pl-k">return</span> <span class="pl-v">out</span>; }, }; } <span class="pl-k">fn</span> <span class="pl-en">walk</span>( <span class="pl-v">allocator</span>: <span class="pl-k">mem.Allocator</span>, <span class="pl-v">iter_dir</span>: <span class="pl-k">*</span><span class="pl-k">fs.IterableDir</span>, <span class="pl-v">visited</span>: <span class="pl-k">*</span><span class="pl-k">VisitedList</span>, <span class="pl-v">level</span>: <span class="pl-k">usize</span>, ) <span class="pl-k">!</span><span class="pl-k">void</span> { <span class="pl-k">var</span> <span class="pl-v">it</span> <span class="pl-k">=</span> <span class="pl-v">iter_dir</span>.<span class="pl-v">iterate</span>(); <span class="pl-k">while</span> (<span class="pl-k">try</span> <span class="pl-v">it</span>.<span class="pl-v">next</span>()) <span class="pl-k">|</span><span class="pl-v">entry</span><span class="pl-k">|</span> { <span class="pl-k">const</span> <span class="pl-v">dupe_name</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">allocator</span>.<span class="pl-v">dupe</span>(<span class="pl-k">u8</span>, <span class="pl-v">entry</span>.<span class="pl-v">name</span>); <span class="pl-k">switch</span> (<span class="pl-v">entry</span>.<span class="pl-v">kind</span>) { <span class="pl-c1">.Directory</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> { <span class="pl-k">try</span> <span class="pl-v">visited</span>.<span class="pl-v">append</span>(.{ .<span class="pl-v">name</span> <span class="pl-k">=</span> <span class="pl-v">dupe_name</span>, .<span class="pl-v">level</span> <span class="pl-k">=</span> <span class="pl-v">level</span> }); <span class="pl-k">var</span> <span class="pl-v">sub_iter_dir</span> <span class="pl-k">=</span> <span class="pl-k">try</span> <span class="pl-v">iter_dir</span>.<span class="pl-v">dir</span>.<span class="pl-v">openIterableDir</span>(<span class="pl-v">entry</span>.<span class="pl-v">name</span>, .{}); <span class="pl-k">defer</span> <span class="pl-v">sub_iter_dir</span>.<span class="pl-v">close</span>(); <span class="pl-k">try</span> <span class="pl-v">walk</span>( <span class="pl-v">allocator</span>, <span class="pl-k">&amp;</span><span class="pl-v">sub_iter_dir</span>, <span class="pl-v">visited</span>, <span class="pl-v">level</span> <span class="pl-k">+</span> <span class="pl-c1">1</span>, ); }, <span class="pl-k">else</span> <span class="pl-k">=</span><span class="pl-k">&gt;</span> { <span class="pl-k">try</span> <span class="pl-v">visited</span>.<span class="pl-v">append</span>(.{ .<span class="pl-v">name</span> <span class="pl-k">=</span> <span class="pl-v">dupe_name</span>, .<span class="pl-v">level</span> <span class="pl-k">=</span> <span class="pl-v">level</span> }); }, } } }</pre></div> <h2 dir="auto">使用示例:</h2> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="./zig-out/bin/tree zig-cache/ zig-cache/ |--z | |--6c2830de7eff2e6c29a466f3dae29f56 | |--a2d9c9576a2de120dc2fe54d26e22b56 |--o | |--31a508b05079f502e9de10cf725ab900 | | |--tree | | |--tree.o | |--c3a7328c0b6d9e4ac745e62c729ae197 | | |--build.o | | |--build | |--d4336c38182f8d4321b881a61531ae3c | | |--builtin.zig | |--d7233815bac1be707323362604efcc18 | | |--dependencies.zig | |--d4ac96c2b77544f5a6d309f1f10d02bd | | |--builtin.zig |--h | |--ef8df946ad597ff441d79907e875840e.txt | |--acd9b03fd406a6d60e3dbfb18849aace.txt | |--timestamp |--tmp "><pre class="notranslate"><code class="notranslate">./zig-out/bin/tree zig-cache/ zig-cache/ |--z | |--6c2830de7eff2e6c29a466f3dae29f56 | |--a2d9c9576a2de120dc2fe54d26e22b56 |--o | |--31a508b05079f502e9de10cf725ab900 | | |--tree | | |--tree.o | |--c3a7328c0b6d9e4ac745e62c729ae197 | | |--build.o | | |--build | |--d4336c38182f8d4321b881a61531ae3c | | |--builtin.zig | |--d7233815bac1be707323362604efcc18 | | |--dependencies.zig | |--d4ac96c2b77544f5a6d309f1f10d02bd | | |--builtin.zig |--h | |--ef8df946ad597ff441d79907e875840e.txt | |--acd9b03fd406a6d60e3dbfb18849aace.txt | |--timestamp |--tmp </code></pre></div> tag:github.com,2008:8552844 zdocs: zig 文档工具 2025-07-08T05:45:24+00:00 2025-10-29T02:55:30+00:00 kindy https://github.com/kindy <p dir="auto">zig 自带的文档工具一般好用,<a href="https://github.com/hon-sh/zdocs">zdocs</a> 尝试优化查看zig文档的体验。<br> 使用起来跟zig官方<a href="https://ziglang.org/documentation/0.14.1/std/" rel="nofollow">在线std文档</a>很像,可以在<a href="https://tt1.hon.sh" rel="nofollow">tt1.hon.sh</a>直接体验。</p> <p dir="auto">跟zig官方std文档的区别是,上面体验地址是服务端渲染的,在手机、w3m上使用体验会更好。<br> 文档首次展示时间会快很多。</p> <p dir="auto">欢迎试用&amp;反馈 🤝</p> <hr> <p dir="auto">之前在社区微信群发了,感觉在那边持续迭代发消息有些打扰,就来这儿发一发,后续在这儿发布更新~</p> tag:github.com,2008:8518807 Writer 和 Reader 接口写太棒了 2025-07-01T16:12:32+00:00 2025-10-28T13:31:55+00:00 DeepDro https://github.com/DeepDro <p dir="auto">var archiver = std.tar.writer(response.writer());<br> 一行代码然后源文件一路看下去,把我这个新手人都看麻了</p> tag:github.com,2008:8630633 通过编译时字符串,调用到某实例的方法 2025-07-25T01:22:24+00:00 2025-10-28T13:25:12+00:00 jiacai2050 https://github.com/jiacai2050 <div class="highlight highlight-source-zig notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="const std = @import(&quot;std&quot;); const MyStruct = struct { value: i32, pub fn print(self: *const MyStruct) void { std.debug.print(&quot;Value: {}\n&quot;, .{self.value}); } }; fn callMethod(comptime T: type, comptime method_name: []const u8, obj: T, args: anytype) void { if (!@hasDecl(T, method_name)) { @compileError(&quot;Method '&quot; ++ method_name ++ &quot;' not found&quot;); } const method = @field(T, method_name); @call(.auto, method, .{&amp;obj} ++ args); } pub fn main() !void { const my_obj = MyStruct{ .value = 10 }; // 通过字符串调用方法 callMethod(MyStruct, &quot;print&quot;, my_obj, .{}); } "><pre class="notranslate"><span class="pl-k">const</span> <span class="pl-v">std</span> <span class="pl-k">=</span> <span class="pl-k">@import</span>(<span class="pl-s">"std"</span>); <span class="pl-k">const</span> <span class="pl-en">MyStruct</span> <span class="pl-k">=</span> <span class="pl-k">struct</span> { <span class="pl-smi">value</span>: <span class="pl-k">i32</span>, <span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">print</span>(<span class="pl-v">self</span>: <span class="pl-k">*</span><span class="pl-k">const</span> <span class="pl-k">MyStruct</span>) <span class="pl-k">void</span> { <span class="pl-v">std</span>.<span class="pl-v">debug</span>.<span class="pl-v">print</span>(<span class="pl-s">"Value: {}<span class="pl-cce">\n</span>"</span>, .{<span class="pl-v">self</span>.<span class="pl-v">value</span>}); } }; <span class="pl-k">fn</span> <span class="pl-en">callMethod</span>(<span class="pl-k">comptime</span> <span class="pl-v">T</span>: <span class="pl-k">type</span>, <span class="pl-k">comptime</span> <span class="pl-v">method_name</span>: []<span class="pl-k">const</span> <span class="pl-k">u8</span>, <span class="pl-v">obj</span>: <span class="pl-k">T</span>, <span class="pl-v">args</span>: <span class="pl-k">anytype</span>) <span class="pl-k">void</span> { <span class="pl-k">if</span> (<span class="pl-k">!</span><span class="pl-c1">@hasDecl</span>(<span class="pl-en">T</span>, <span class="pl-v">method_name</span>)) { <span class="pl-c1">@compileError</span>(<span class="pl-s">"Method '"</span> <span class="pl-k">++</span> <span class="pl-v">method_name</span> <span class="pl-k">++</span> <span class="pl-s">"' not found"</span>); } <span class="pl-k">const</span> <span class="pl-v">method</span> <span class="pl-k">=</span> <span class="pl-c1">@field</span>(<span class="pl-en">T</span>, <span class="pl-v">method_name</span>); <span class="pl-c1">@call</span>(<span class="pl-c1">.auto</span>, <span class="pl-v">method</span>, .{<span class="pl-k">&amp;</span><span class="pl-v">obj</span>} <span class="pl-k">++</span> <span class="pl-v">args</span>); } <span class="pl-k">pub</span> <span class="pl-k">fn</span> <span class="pl-en">main</span>() <span class="pl-k">!</span><span class="pl-k">void</span> { <span class="pl-k">const</span> <span class="pl-v">my_obj</span> <span class="pl-k">=</span> <span class="pl-k">MyStruct</span>{ .<span class="pl-v">value</span> <span class="pl-k">=</span> <span class="pl-c1">10</span> }; <span class="pl-c">// 通过字符串调用方法</span> <span class="pl-v">callMethod</span>(<span class="pl-en">MyStruct</span>, <span class="pl-s">"print"</span>, <span class="pl-v">my_obj</span>, .{}); } </pre></div> <ul dir="auto"> <li><a href="https://codapi.org/embed/?sandbox=zig&amp;code=data%3A%3Bbase64%2CXVHLSsNAFN3PVxxnoYmG1MdGEgpd6NKVxY1KyWPSTklmQjIplBIQXPgDPsAPEBcKohtd%2BTM%2B6l%2FIZFqtZpNk5p7XPZEUpUKpYrTR4VkuC2XRUsXU9gmJmsu98b4qqkihjdJ8TAgAjIK0Yh741qZDmoO8CpEI5AUXyipZmnhY%2FUthYyR5PMPrp1SxG7Ow6rsGRQ8M6aQ%2BEtSBO9E0bqNU234Dq0ntE5IIREGa7jE1kLEVySxXPGPoelDjnDn4OcmaiZ4IMubh8Nj4qbYdyHDooesgKPqlh0CMNfCPQZ7AWuoMgnKHRanVdRa5bHshRUer8ZTtFoUsLGpMYYVibW0Ro3%2FpCoRUSGQlmh2bRM3LWDPzuo2EszT%2BL2sQHZ3dcoNKyfm1XtayDIe1VtGZbJ%2FUhMw6yQIuLBtLC%2BlmcuOeDIdo%2F1Q0gVk32thYh161Hm618HVyPX09e7%2B%2F%2Bry7eXt%2BnD6cfp7ffly%2BfDxdGL7fOuZcDmhTK3VmOtqk7rH%2BBg%3D%3D" rel="nofollow">https://codapi.org/embed/?sandbox=zig&amp;code=data%3A%3Bbase64%2CXVHLSsNAFN3PVxxnoYmG1MdGEgpd6NKVxY1KyWPSTklmQjIplBIQXPgDPsAPEBcKohtd%2BTM%2B6l%2FIZFqtZpNk5p7XPZEUpUKpYrTR4VkuC2XRUsXU9gmJmsu98b4qqkihjdJ8TAgAjIK0Yh741qZDmoO8CpEI5AUXyipZmnhY%2FUthYyR5PMPrp1SxG7Ow6rsGRQ8M6aQ%2BEtSBO9E0bqNU234Dq0ntE5IIREGa7jE1kLEVySxXPGPoelDjnDn4OcmaiZ4IMubh8Nj4qbYdyHDooesgKPqlh0CMNfCPQZ7AWuoMgnKHRanVdRa5bHshRUer8ZTtFoUsLGpMYYVibW0Ro3%2FpCoRUSGQlmh2bRM3LWDPzuo2EszT%2BL2sQHZ3dcoNKyfm1XtayDIe1VtGZbJ%2FUhMw6yQIuLBtLC%2BlmcuOeDIdo%2F1Q0gVk32thYh161Hm618HVyPX09e7%2B%2F%2Bry7eXt%2BnD6cfp7ffly%2BfDxdGL7fOuZcDmhTK3VmOtqk7rH%2BBg%3D%3D</a></li> </ul> tag:github.com,2008:8457411 你们好,初次接触zig,对于它的协程实现有一些疑问 2025-06-16T09:03:42+00:00 2025-10-28T12:45:41+00:00 npc1054657282 https://github.com/npc1054657282 <p dir="auto">我看到zig的协程力图实现“非染色”的协程,因此比较感兴趣,进而简单地了解了一下这个语言。看起来这个语言是偏向于底层,追求0成本抽象和极致显式的哲学,因此我对于它的协程的逻辑上的约定实现细节比较好奇:<br> zig的协程的变量是什么时候出现在堆上的?对于0成本抽象与非染色的协程,我的理解是“一个返回future的函数”,如果是这样的解释的话,协程中创建的变量应该约定为在首次await之前都在栈上,而在首次await的时候将所有变量转移到堆中的函数帧上,我的理解正确吗?</p> tag:github.com,2008:8944091 zig无锁数据结构个人探索 2025-09-25T07:31:37+00:00 2025-09-25T08:31:35+00:00 npc1054657282 https://github.com/npc1054657282 <p dir="auto">zig标准库里无锁实现好像不多。个人项目用到了,然后参照着disruptor之类的实现挠着头做了一版,项目里用着没啥问题,就大致拷贝出来写了些实现<a href="https://github.com/npc1054657282/mpsc/tree/main/zh-CN">思路</a>。</p> tag:github.com,2008:8936664 分享一个 paseto 库: zig-paseto 2025-09-23T11:09:49+00:00 2025-09-23T11:10:55+00:00 deatil https://github.com/deatil <p dir="auto">项目地址: <a href="https://github.com/deatil/zig-paseto">https://github.com/deatil/zig-paseto</a></p> <p dir="auto">paseto 是一个试图替代 JWT 的新的无状态机制的项目,宗旨在于规避 JWT 会出现的一些不可控问题。<br> 其他语言也有了实现, zig 也不能落后,就有了该库。</p> <p dir="auto">当前库实现了 V3 和 V4 两个协议。</p> tag:github.com,2008:8579837 anyzig的网络下载问题 2025-07-14T06:03:09+00:00 2025-07-19T13:53:28+00:00 wujilingfeng https://github.com/wujilingfeng <p dir="auto">我想使用anyzig,但是发现anyzig不论在windows还是linux,下载某个版本zig编译器时就会卡住,似乎下载不下来。这种情况怎么处理?需要设置镜像么?</p> tag:github.com,2008:8559034 ....... 2025-07-09T11:49:59+00:00 2025-07-15T07:39:20+00:00 sdzx-1 https://github.com/sdzx-1 <p dir="auto">这里更新polystate 的开发进展。</p> tag:github.com,2008:8548186 编译时export C-ABI weak函数问题 2025-07-07T06:51:03+00:00 2025-07-07T11:54:57+00:00 MIIPON https://github.com/MIIPON <p dir="auto">使用zig版本0.14.1。</p> <p dir="auto">在处理单片机中断处理函数时,参考c的处理方式,想将所有中断处理函数先进行weak定义,并与Default_Handler同地址,实际使用时再通过strong函数覆盖。</p> <p dir="auto">在实际zig中,我想使用中断ID枚举的位域来在编译时生成语句进行多个中断函数导出。</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content="pub const IRQn = enum(i32) { Reset = -15, NMI = -14, HardFault = -13, _, }; fn Default_Handler() callconv(.c) void { while (true) {} } comptime { @export(&amp;memoryInit, .{ .name = &quot;memoryInit&quot;, .linkage = .weak }); @export(&amp;systemInit, .{ .name = &quot;systemInit&quot;, .linkage = .weak }); @export(&amp;Reset_Handler, .{ .name = &quot;Reset_Handler&quot;, .linkage = .weak }); const fields = @typeInfo(IRQn).@&quot;enum&quot;.fields; for (fields[1..]) |field| { @export(&amp;Default_Handler, .{ .name = field.name ++ &quot;_Handler&quot;, .linkage = .weak }); } }"><pre class="notranslate"><code class="notranslate">pub const IRQn = enum(i32) { Reset = -15, NMI = -14, HardFault = -13, _, }; fn Default_Handler() callconv(.c) void { while (true) {} } comptime { @export(&amp;memoryInit, .{ .name = "memoryInit", .linkage = .weak }); @export(&amp;systemInit, .{ .name = "systemInit", .linkage = .weak }); @export(&amp;Reset_Handler, .{ .name = "Reset_Handler", .linkage = .weak }); const fields = @typeInfo(IRQn).@"enum".fields; for (fields[1..]) |field| { @export(&amp;Default_Handler, .{ .name = field.name ++ "_Handler", .linkage = .weak }); } } </code></pre></div> <p dir="auto">结果通过readelf发现只有第一个位域被导出为weak函数。</p> <div class="snippet-clipboard-content notranslate position-relative overflow-auto" data-snippet-clipboard-copy-content=" 35: 00000559 4 FUNC WEAK DEFAULT 3 NMI_Handler 36: 00000000 1024 OBJECT GLOBAL DEFAULT 1 vector 37: 20000000 0 NOTYPE GLOBAL DEFAULT ABS _estack 38: 00000400 16 OBJECT GLOBAL DEFAULT 2 flashconfig 39: 00000559 4 FUNC GLOBAL DEFAULT 3 HardFault_Handler"><pre class="notranslate"><code class="notranslate"> 35: 00000559 4 FUNC WEAK DEFAULT 3 NMI_Handler 36: 00000000 1024 OBJECT GLOBAL DEFAULT 1 vector 37: 20000000 0 NOTYPE GLOBAL DEFAULT ABS _estack 38: 00000400 16 OBJECT GLOBAL DEFAULT 2 flashconfig 39: 00000559 4 FUNC GLOBAL DEFAULT 3 HardFault_Handler </code></pre></div> <p dir="auto">想了解一下原因。</p> tag:github.com,2008:8423920 zig 的 leaked 问题,好些带 gc 的语言可以实现的,到 zig 就得绕一圈才行 2025-06-06T08:12:23+00:00 2025-06-16T09:20:40+00:00 deatil https://github.com/deatil <p dir="auto">最近解决 totp 的 leaked 问题,用之前逻辑好些完全行不通,只能放弃一些逻辑写法</p> tag:github.com,2008:8371196 使用 `@setFloatMode` 后依然比等价的 C 代码慢很多? 2025-05-25T15:57:23+00:00 2025-06-15T06:53:17+00:00 w568w https://github.com/w568w <p dir="auto">代码是从 <a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/performance/spectralnorm.html" rel="nofollow">CLBG</a> 改编来的,主要测试浮点运算性能。</p> <p dir="auto">C 源码:<a href="https://0x0.st/8xMC.c" rel="nofollow">https://0x0.st/8xMC.c</a><br> Zig 源码:<a href="https://0x0.st/8xui.c" rel="nofollow">https://0x0.st/8xui.c</a></p> <p dir="auto">用下面的命令可以快速运行:</p> <div class="highlight highlight-source-shell notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="# C curl https://0x0.st/8xMC.c | gcc -x c -lm -march=native -Ofast -o a.out - &amp;&amp; time ./a.out # Zig tmp=$(mktemp -t tmp.XXXXXX.zig); curl https://0x0.st/8xui.c -o &quot;$tmp&quot; &amp;&amp; zig build-exe -O ReleaseFast -femit-bin=a.out &quot;$tmp&quot; &amp;&amp; time ./a.out"><pre class="notranslate"><span class="pl-c"><span class="pl-c">#</span> C</span> curl https://0x0.st/8xMC.c <span class="pl-k">|</span> gcc -x c -lm -march=native -Ofast -o a.out - <span class="pl-k">&amp;&amp;</span> <span class="pl-k">time</span> ./a.out <span class="pl-c"><span class="pl-c">#</span> Zig</span> tmp=<span class="pl-s"><span class="pl-pds">$(</span>mktemp -t tmp.XXXXXX.zig<span class="pl-pds">)</span></span><span class="pl-k">;</span> curl https://0x0.st/8xui.c -o <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$tmp</span><span class="pl-pds">"</span></span> <span class="pl-k">&amp;&amp;</span> zig build-exe -O ReleaseFast -femit-bin=a.out <span class="pl-s"><span class="pl-pds">"</span><span class="pl-smi">$tmp</span><span class="pl-pds">"</span></span> <span class="pl-k">&amp;&amp;</span> <span class="pl-k">time</span> ./a.out</pre></div> <p dir="auto">我这里的测试结果是:</p> <ul dir="auto"> <li>C (<code class="notranslate">-Ofast</code>): 0.296s</li> <li>C (<code class="notranslate">-O3 -ffast-math</code>): 0.600s</li> <li>C (<code class="notranslate">-O3</code>): 0.732s</li> <li>Zig: 1.195s</li> <li>Zig(去掉 <code class="notranslate">@setFloatMode(.optimized)</code>):1.192s</li> </ul> <p dir="auto">如上,加不加 <code class="notranslate">@setFloatMode(.optimized)</code> 好像都没有区别,相比 C(<code class="notranslate">-Ofast</code>)要慢至 4 倍。但根据文档里说的,该命令等价于 <code class="notranslate">-ffast-math</code>,而 C 加上 <code class="notranslate">-ffast-math</code> 会加速很多。</p> <p dir="auto">是我哪里没考虑到吗?</p> <hr> <ul dir="auto"> <li>CPU: <code class="notranslate">AMD Ryzen 7 8845HS</code></li> <li>GCC: <code class="notranslate">15.1.1 20250425</code></li> <li>Zig: <code class="notranslate">0.14.1</code></li> </ul> tag:github.com,2008:8371003 朋友们,有人了解微软的dynamic debugging吗,我感觉这在计算密集的开发中会很有用 2025-05-25T14:21:56+00:00 2025-06-06T10:01:08+00:00 inschrift-spruch-raum https://github.com/inschrift-spruch-raum <p dir="auto">如题,debug调试起来在这块效率太低了</p> tag:github.com,2008:7930300 Zig 支持 用户自定义 "注解" 吗 2025-02-08T03:34:22+00:00 2025-05-17T13:06:54+00:00 aceyin https://github.com/aceyin <p dir="auto">萌新,有 java,go,rust,typescript 的背景。</p> <p dir="auto">昨天才刚翻完 Zig 圣经,第一眼对 zig 还是比较喜欢的。</p> <p dir="auto">手撸框架比较多,所以对于一个一门语言是否原生支持 “注解”(Java 的叫法, typescript 里面叫 装饰器)非常关心。</p> <p dir="auto">因为这个特性对于写框架来说,太实用了。</p> <p dir="auto">举例来说(Java),你要写一个 “表单类”,有注解支持的情况下,表单字段的验证就很容易实现:</p> <div class="highlight highlight-source-java notranslate position-relative overflow-auto" dir="auto" data-snippet-clipboard-copy-content="class UserForm { @NotNull Long id; @Size(min = 3, max = 8) String name; @Email String email; }"><pre class="notranslate"><span class="pl-k">class</span> <span class="pl-smi">UserForm</span> { <span class="pl-c1">@</span><span class="pl-c1">NotNull</span> <span class="pl-smi">Long</span> <span class="pl-s1">id</span>; <span class="pl-c1">@</span><span class="pl-c1">Size</span>(<span class="pl-s1">min</span> = <span class="pl-c1">3</span>, <span class="pl-s1">max</span> = <span class="pl-c1">8</span>) <span class="pl-smi">String</span> <span class="pl-s1">name</span>; <span class="pl-c1">@</span><span class="pl-c1">Email</span> <span class="pl-smi">String</span> <span class="pl-s1">email</span>; }</pre></div> <p dir="auto">搜了一下 zig github 上面的 issues,没有发现有专门的信息说是支持注解的。</p> <p dir="auto">所以想在这里问问:zig 目前支持 “注解”吗?尤其是用户自定义注解!</p> <p dir="auto">或者有计划支持吗?</p>