tag:github.com,2008:/zigcc/forum/discussions
Recent discussions in zigcc/forum
2026-03-19T04:38:19+00:00
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:8991619
✨Zig文件是一个`struct`
2025-10-06T11:17:38+00:00
2026-03-19T04:34:52+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("std");"><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("std");
hello: [14:0]u8 = "Hello, world!\n".*, // What?
fn print(self: @This()) void {
std.debug.print("{s}", .{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("std.zig")
};"><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: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=.{"key","myvalue"}});
const TagPayloads = struct{
const tag1 : TypedefConfig.Tag = .Tag{.keyvaluearr=.{.{"key","myvalue"}, .{"otherkey","othervalue"}}});
}
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.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MTAyNzEsIm5iZiI6MTc3MzkwOTk3MSwicGF0aCI6Ii82MjA4NzA4OS81NjUzMTY1NjAtMDNiNTdmZDUtYzRkNi00YzMyLWIyMzMtNDExNDU4YzIzZThhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzE5VDA4NDYxMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA5Y2M3NmZmMDU4YjEzMWI1NjBiZTNhOGUxNGU3MDdkZTRiMTEyODYyZWM1MGZlZWRkNWU0Mzg5MjEyNjc5YTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.mI_om5xk7y73Al-6ElBZlAXzWKP0i1O6qz0qseKa9I8"><img src="https://private-user-images.githubusercontent.com/62087089/565316560-03b57fd5-c4d6-4c32-b233-411458c23e8a.jpg?jwt=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NzM5MTAyNzEsIm5iZiI6MTc3MzkwOTk3MSwicGF0aCI6Ii82MjA4NzA4OS81NjUzMTY1NjAtMDNiNTdmZDUtYzRkNi00YzMyLWIyMzMtNDExNDU4YzIzZThhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNjAzMTklMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjYwMzE5VDA4NDYxMVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA5Y2M3NmZmMDU4YjEzMWI1NjBiZTNhOGUxNGU3MDdkZTRiMTEyODYyZWM1MGZlZWRkNWU0Mzg5MjEyNjc5YTgmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.mI_om5xk7y73Al-6ElBZlAXzWKP0i1O6qz0qseKa9I8" 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,
&base_addr,
0,
&region_size,
alloc_type,
protect,
);
if (status != .SUCCESS) {
return switch (status) {
.ACCESS_DENIED => error.AccessDenied,
.NO_MEMORY, .CONFLICTING_ADDRESSES => error.NoMemory,
.INVALID_HANDLE => error.InvalidHandle,
else => 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">&</span><span class="pl-v">base_addr</span>,
<span class="pl-c1">0</span>,
<span class="pl-k">&</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">></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">></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">></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">></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("std");
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 > 1)
args[1]
else
".";
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, &iter_dir, &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("\n");
}
try writer.flush();
}
fn makePrefix(allocator: std.mem.Allocator, level: usize) ![]const u8 {
const prefix = "| ";
const base = "|--";
return switch (level) {
0 => return "",
1 => return base,
else => {
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 => {
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,
&sub_iter_dir,
visited,
level + 1,
);
},
else => {
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">></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">&</span><span class="pl-v">iter_dir</span>, <span class="pl-k">&</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">></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">></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">></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">></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">&</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">></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">欢迎试用&反馈 🤝</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("std");
const MyStruct = struct {
value: i32,
pub fn print(self: *const MyStruct) void {
std.debug.print("Value: {}\n", .{self.value});
}
};
fn callMethod(comptime T: type, comptime method_name: []const u8, obj: T, args: anytype) void {
if (!@hasDecl(T, method_name)) {
@compileError("Method '" ++ method_name ++ "' not found");
}
const method = @field(T, method_name);
@call(.auto, method, .{&obj} ++ args);
}
pub fn main() !void {
const my_obj = MyStruct{ .value = 10 };
// 通过字符串调用方法
callMethod(MyStruct, "print", 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">&</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&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&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(&memoryInit, .{ .name = "memoryInit", .linkage = .weak });
@export(&systemInit, .{ .name = "systemInit", .linkage = .weak });
@export(&Reset_Handler, .{ .name = "Reset_Handler", .linkage = .weak });
const fields = @typeInfo(IRQn).@"enum".fields;
for (fields[1..]) |field| {
@export(&Default_Handler, .{ .name = field.name ++ "_Handler", .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(&memoryInit, .{ .name = "memoryInit", .linkage = .weak });
@export(&systemInit, .{ .name = "systemInit", .linkage = .weak });
@export(&Reset_Handler, .{ .name = "Reset_Handler", .linkage = .weak });
const fields = @typeInfo(IRQn).@"enum".fields;
for (fields[1..]) |field| {
@export(&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 - && time ./a.out
# Zig
tmp=$(mktemp -t tmp.XXXXXX.zig); curl https://0x0.st/8xui.c -o "$tmp" && zig build-exe -O ReleaseFast -femit-bin=a.out "$tmp" && 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">&&</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">&&</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">&&</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>