zig并不强迫程序员使用可选类型,完全可以使用与C相同的处理方式。 在任意普通类型前加上?,就表示该数据类型的可选类型: const numOrNull: ?i32 = null; numOrNull就是一个可选类型的变量,该变量可以被赋值为i32类型的整数或是null。 可以使用if或switch语句解构可选类型,或采用以下两种方式: if 和switch ...
Zig 没有任何 null 引用。它有可选类型,用问号在前表示。你只能把 null 分配给可选类型,并且只有在你检查了它们不是 null 的情况下才能引用它们,使用 orelse 关键字或者简单的 if 表达式就可以。否则,将会导致编译错误。const Person = struct { age: u8 };const maybe_p: Person = null; // ...
另一方面,Zig没有任何参考资料。它具有可选类型,在开头用问号表示。只能给可选类型赋值,并且只能在使用关键字或简单地通过表达式检查它们是否为null时引用它们(null引用曾被快速排序算法的创造者托尼·霍尔称为"十亿美元错误")。否则,你将最终面临编译错误。复制 const Person = struct { age: u8};const ma...
这段C 代码会突然崩溃,除了一个 SIGSEGV,什么线索都没有,让你不知所措: struct MyStruct {int myField; int main() {struct MyStruct* myStructPtr = NULL;int value; value = myStructPtr->myField; // 访问未初始化结构的字段 printf("Value: %d\n", value); return 0; Zig 没有任何 null 引用。
Zig 简化了很多东西,也因此被戏称 Rust --, 但是简化不代表弱,Zig 为 C 语言提供了一个很不错的解决方案,提供更安全的内存管理,编译时计算(comptime)以及丰富的标准库。 使用Zig 进行 PostgreSQL 开发的一个主要原因是它能够与 C 代码进行互操作。Zig 支持 C ABI,可以与 C 指针和数据类型兼容,包括 NULL ...
安全性,告别心惊胆战:Zig用可选类型代替null,就像是给你的代码穿上了防弹衣,让你再也不用担心空...
可选类型?T可以是null或者T类型值。 错误集合类型error{...}包含错误值的枚举类型。 函数类型fn(T1, T2, ...) -> R接受参数并返回结果的函数类型。 结构体类型struct { ... }包含多个字段的复合数据类型。 枚举类型enum { ... }固定数量的命名值的集合。
c_allocator StackFallbackAllocator LoggingAllocator Zig 还支持你自定义分配器。 亿万美元的错误 vs Zig Optionals 这段C 代码会突然崩溃,除了一个SIGSEGV,什么线索都没有,让你不知所措: structMyStruct {intmyField;}; intmain(){structMyStruct* myStructPtr = NULL;intvalue; ...
可选的 null 值保证是地址 0。 指针运算 vs Zig Slice 在C 语言中,地址是用一个数值来表示的,这允许开发者对指针进行算术运算。这个特性使得 C 语言开发者能够通过操作地址来访问和修改任意内存位置。 指针算术常用于诸如操作或访问数组的特定部分或高效地遍历动态分配的内存块等任务,而无需进行复制。然而,由于 ...
使用Zig 进行 PostgreSQL 开发的一个主要原因是它能够与 C 代码进行互操作。Zig 支持 C ABI,可以与 C 指针和数据类型兼容,包括 NULL 结束的字符串,并且甚至可以将 C 头文件转换为 Zig 代码。Zig 将 C 语言的宏自动转换为 Zig 代码的功能虽然还不是很完美,但仍然很有帮助。