标签: zig

Zig“翻译c”不翻译主要功能

我创建了一个 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函数的规则是什么?

c zig

3
推荐指数
1
解决办法
831
查看次数

如何在 Zig 中打印 UTF-16 字符串?

我一直在尝试编写 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)?

unicode utf-16 zig

3
推荐指数
1
解决办法
461
查看次数

在 Zig 中实现基本的经典 try-catch

如何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)

如果可能,请显示上述代码的修改版本。

struct segmentation-fault zig

3
推荐指数
1
解决办法
2593
查看次数

如何将 Zig 函数指针传递给其他函数?

当我将一个函数传递给另一个函数时,出现以下错误?

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

compiler-errors function-pointers zig

3
推荐指数
1
解决办法
2931
查看次数

如何在 Zig 中打印十六进制数字?

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符合预期。
如何将该值打印为十六进制?

hex zig

3
推荐指数
1
解决办法
1403
查看次数

Zig 创建 C 库

已关闭- 请参阅条目末尾

我想使用 Zig 语言制作一个 C 可调用库。我决定从 Zig 文档中的两个示例开始。“导出 C 库”和“混合目标文件”。在每种情况下,我都复制了三个相关文件(来自 0.6.0 文档)。

  • AC文件名为test.c,
  • 分别名为 mathtest.zig(对于导出 C 库示例)和 base64.zig(对于混合对象文件示例)的 zig 文件,以及
  • 一个 build.zig 文件。

这两个示例都无法构建。

导出 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)

zig

2
推荐指数
1
解决办法
2909
查看次数

在 Zig 中使用 X11 C 库时出现分段错误

我正在尝试将 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)

x11 segmentation-fault zig

2
推荐指数
1
解决办法
648
查看次数

整数和浮点类型的 zig maxValue

zig 曾经使用@maxValue来查询整数类型的最大值,但我认为它在几个版本前已被删除。有替代品吗?我找不到它。

\n

zig

2
推荐指数
1
解决办法
2494
查看次数

如何从第三方模块重新导出函数

我有一个有用的模块,但我想在不修改foo.zig它的情况下为其添加更多功能,因此我创建了一个具有一两个以上功能的模块,并且具有数十个功能。foo-wrapper.zigfoo.zig

我如何将所有功能重新导出(使用pub或某种东西)给foo.zig的所有消费者foo-wrapper.zig

zig

2
推荐指数
1
解决办法
490
查看次数

调用“zig build run”时可以传递命令行参数吗?

我刚刚开始使用新的编程语言 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 本身的命令行开关似乎都没有达到我想要的效果,而且我找不到任何人通过谷歌搜索来讨论这个问题。

command-line-arguments zig

2
推荐指数
1
解决办法
1573
查看次数