我从未在其他流行语言中见过像Zig这样高效的C-互操作。大多数语言使用FFI(外部函数接口)来实现C-互操作,但是Zig允许你调用C,甚至不需要在Zig范围内定义C函数。当你导入C头文件时,它会自动创建结构类型:复制 const std = @import("std");const c = @cImport({ @cInclude("stdio.h");});pub fn mai...
./src/main.zig:17:45: error: expectedtype'comptime_int', found'c_int'try testing.expectEqual(0, c.count_bytes(&cstr)); ^ Run Code Online (Sandbox Code Playgroud) 我还尝试将字符串转换为C 指针,如 Zig 文档中所示: test"should be able to count string length"{varcstr: [*c]u8 = &...
Zig的comptime计算还可以涵盖C语言的一些小特性:例如,在最小值为-2^15=-32768且最大值为(2^15)-1=32767的平台中signed,不可能在C中将类型的最小值写signed为文字常量。复制 signed x = -32768; // not possible in C1.这是因为在C中-32768实际上is-1 * 32768并且32768不在signed类型的边界内。然而...
Zig的comptime计算还可以涵盖C语言的一些小特性:例如,在最小值为-2^15=-32768且最大值为(2^15)-1=32767的平台中signed,不可能在C中将类型的最小值写signed为文字常量。 signed x = -32768; // not possible in C 这是因为在C中-32768实际上is-1 * 32768并且32768不在signed类型的边界内。然而,在Zig...
test "multi-line string" { const fullstr = \\尊敬的大领导: \\ 您好! \\小的是某某某…… ; print("{s}\n", .{fullstr}); } 用两个反斜杠做为开头,似乎更有利于代码格式化,显得非常尊敬。这一点很有意思。 有关字符串的核心语法就梳理到这里。
关于[*:0]const u8这个类型,其实这个类型就是c的string(这里使用这个类型是为了兼容cstr的比较函数) const Self = @This();这个语法会很常见的,各位明白类似很多语言的this和Self做的事情即可 zig支持直接使用const xxx = xxx;的语法直接添加子类型(也可以添加其他常量) ...
另一方面,Zig通过引入参数和函数,为这类任务采用了更加直观的方法。这使我们能够在编译时而不是运行时执行函数。下面是同一个C语言宏在Zig: comptimesSQUARE中 复制 fn square(x: anytype) @TypeOf(x) { return x * x; } const result = comptime square(2 + 3); // result = 25, at compile-time...
const std = @import("std"); pub fn main() void { const string = [_]u8{ 'a', 'b', 'c' }; // 用心去体会语法。 // 括号内的是可迭代对象,bar 内的是被赋的值。 for (string, 0..) |character, index| { _ = character; _ = index; } for (string) |character| { _ = ...
大多数编程语言都有一个或多个标准编译器和标准库实现。例如,您可以使用以下编译C: - GNU C - Apple Clang - 带有libc、BSD-libc和Microsoft C运行时的MSVC编译器 但是这两个组件对于现代系统编程需求来说还不够。程序员通常需要建立工具、包管理器和交叉编译工具等。
{stm:*A_Stm,exp:*A_Exp,};id:string,num:isize,// just like int in c and c++op:*A_Op,eseq:*A_Eseq,constSelf=@This();pub fnidExp(id:string)*Self{constallocator=std.heap.page_allocator;var self=allocator.create(Self)catch@panic("failed to create idExp");self.*=.{.id=id};...