我创建了一个 C 文件:
int main() {
return 1;
}
Run Code Online (Sandbox Code Playgroud)
我使用 Zig 的translate-c命令行选项来生成一个 zig 文件,但我只得到了一些全局变量声明,例如
pub const __GCC_ATOMIC_TEST_AND_SET_TRUEVAL = 1;
pub const __FLT16_MAX_EXP__ = 15;
pub const __BIGGEST_ALIGNMENT__ = 16;
pub const __SIZEOF_FLOAT__ = 4;
pub const __INT64_FMTd__ = c"ld";
pub const __STDC_VERSION__ = c_long(201112);
... // and many
Run Code Online (Sandbox Code Playgroud)
并没有main找到任何功能。但是如果我把函数名改成myFunction这样:
int myFunction(int a) {
return a;
}
Run Code Online (Sandbox Code Playgroud)
当我重新生成它时会出现一个函数:
pub export fn myFunction(a: c_int) c_int {
return a;
}
Run Code Online (Sandbox Code Playgroud)
我错过了什么吗?zigtranslate-c函数的规则是什么?
我一直在尝试编写 UTF-16 字符串结构,尽管标准库提供了一个unicode模块,但它似乎没有提供打印出u16. 我试过这个:
const std = @import("std");
const unicode = std.unicode;
const stdout = std.io.getStdOut().outStream();
pub fn main() !void {
const unicode_str = unicode.utf8ToUtf16LeStringLiteral(" hello! ");
try stdout.print("{}\n", .{unicode_str});
}
Run Code Online (Sandbox Code Playgroud)
这输出:
[12:0]u16@202e9c
Run Code Online (Sandbox Code Playgroud)
有没有办法打印 unicode 字符串 ( []u16) 而不将其转换回非 unicode 字符串 ( []u8)?
如何try-catch在 Zig 中实现经典的错误处理?
例如。如何解决这个错误并且只有append在没有错误发生时才执行?
var stmt = self.statement() catch {
self.synchronize(); // Only execute this when there is an error.
};
self.top_level.statements.append(stmt); // HELP? This should only be executed when no error
// ...
fn synchronize() void {
// ...implementation
}
fn statement() SomeError!void {
// ...implementation
}
Run Code Online (Sandbox Code Playgroud)
如果可能,请显示上述代码的修改版本。
当我将一个函数传递给另一个函数时,出现以下错误?
const std = @import("std");
const St = struct { a: usize };
fn returnFunc(print: fn (str: []const u8, st: St) void) void {
print("Hello", St{ .a = 1 });
}
fn toTest(str: []const u8, st: St) void {
std.debug.print("{s}: {d}\n", .{str, st.a});
}
pub fn main() !void {
returnFunc(toTest);
}
Run Code Online (Sandbox Code Playgroud)
返回以下错误:
error: parameter of type 'fn([]const u8, main.St) void' must be declared comptime
Run Code Online (Sandbox Code Playgroud)
机器详细信息: Zig 版本:0.10.0-dev.4588+9c0d975a0 M1 Mac、MAC OS Ventura
const std = @import("std");
pub fn main() void {
const foo: u8 = 128;
std.debug.print("{}\n", .{foo}); // "128"
}
Run Code Online (Sandbox Code Playgroud)
上面的打印内容128符合预期。
如何将该值打印为十六进制?
已关闭- 请参阅条目末尾
我想使用 Zig 语言制作一个 C 可调用库。我决定从 Zig 文档中的两个示例开始。“导出 C 库”和“混合目标文件”。在每种情况下,我都复制了三个相关文件(来自 0.6.0 文档)。
这两个示例都无法构建。
导出 C 库示例无法编译 test.c,并显示消息无法找到 mathtest.h
混合对象文件示例无法编译 test.c,并且找不到 base64.h
以下是导出 C 库示例的三个文件:
数学测试.zig
export fn add(a: i32, b: i32) i32 {
return a + b;
}
Run Code Online (Sandbox Code Playgroud)
测试.c
// This header is generated by zig from mathtest.zig
#include "mathtest.h"
#include <stdio.h>
int main(int argc, char **argv) {
int32_t result = add(42, 1337);
printf("%d\n", result);
return 0; …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 X11 与 Zig 一起使用。使用https://rosettacode.org/wiki/Window_creation/X11#Xlib中的代码作为示例,我想出了这个最小的示例:
const c = @cImport({
@cInclude("X11/Xlib.h");
});
pub fn main() void {
var maybe_display : ?*c.Display = c.XOpenDisplay(@as(?*u8, null));
}
Run Code Online (Sandbox Code Playgroud)
使用最新版本的 Zig (0.6.0) 进行编译:
zig build-exe -lX11 main.zig
Run Code Online (Sandbox Code Playgroud)
在执行时我收到以下错误:
Segmentation fault at address 0x0
attempt to unwrap error: InvalidExe
Panicked during a panic. Aborting.
fish: './main' terminated by signal SIGABRT (Abort)
Run Code Online (Sandbox Code Playgroud) zig 曾经使用@maxValue来查询整数类型的最大值,但我认为它在几个版本前已被删除。有替代品吗?我找不到它。
\n我有一个有用的模块,但我想在不修改foo.zig它的情况下为其添加更多功能,因此我创建了一个具有一两个以上功能的模块,并且具有数十个功能。foo-wrapper.zigfoo.zig
我如何将所有功能重新导出(使用pub或某种东西)给foo.zig的所有消费者foo-wrapper.zig?
我刚刚开始使用新的编程语言 Zig,发现文档非常稀疏。
我可以通过调用来构建并运行当前项目zig build run。
我还可以zig run src/main.zig假设标准项目布局。
但在这两种情况下,我都找不到将命令行参数传递给我的项目的方法。
我知道构建后我可以将我的项目作为二进制文件调用zig-out/bin/<my project's name> foo bar,但是有没有办法直接从 执行它build run?
只是尝试显而易见的zig build run foo bar告诉我Cannot run step 'foo' because it does not exist。
zig 本身的命令行开关似乎都没有达到我想要的效果,而且我找不到任何人通过谷歌搜索来讨论这个问题。