871 lines
17 KiB
Markdown
871 lines
17 KiB
Markdown
# Zig Built-in Functions Reference
|
|
|
|
Built-in functions are compiler intrinsics prefixed with `@`. Parameters marked `comptime` must be compile-time known.
|
|
|
|
## Table of Contents
|
|
- [Type Conversions](#type-conversions)
|
|
- [Integer/Float Operations](#integerfloat-operations)
|
|
- [Overflow Arithmetic](#overflow-arithmetic)
|
|
- [Bit Manipulation](#bit-manipulation)
|
|
- [Memory Operations](#memory-operations)
|
|
- [Atomics](#atomics)
|
|
- [Type Introspection](#type-introspection)
|
|
- [Comptime Utilities](#comptime-utilities)
|
|
- [SIMD/Vector](#simdvector)
|
|
- [C Interop](#c-interop)
|
|
- [Debug/Control Flow](#debugcontrol-flow)
|
|
|
|
## Type Conversions
|
|
|
|
### @as
|
|
```zig
|
|
@as(comptime T: type, expr) T
|
|
```
|
|
Safe type coercion. Preferred over explicit casts when conversion is unambiguous.
|
|
```zig
|
|
const x = @as(u32, 5); // comptime_int → u32
|
|
```
|
|
|
|
### @intCast
|
|
```zig
|
|
@intCast(value: anytype) anytype
|
|
```
|
|
Convert between integer types. Runtime safety check if value doesn't fit.
|
|
```zig
|
|
const big: u64 = 100;
|
|
const small: u8 = @intCast(big); // OK if value fits
|
|
```
|
|
|
|
### @floatCast
|
|
```zig
|
|
@floatCast(value: anytype) anytype
|
|
```
|
|
Convert between float types. Return type inferred.
|
|
```zig
|
|
const d: f64 = 3.14;
|
|
const f: f32 = @floatCast(d);
|
|
```
|
|
|
|
### @intFromFloat
|
|
```zig
|
|
@intFromFloat(value: anytype) anytype
|
|
```
|
|
Float → integer. Truncates fractional part. Return type inferred.
|
|
```zig
|
|
const i: i32 = @intFromFloat(3.7); // i = 3
|
|
```
|
|
|
|
### @floatFromInt
|
|
```zig
|
|
@floatFromInt(value: anytype) anytype
|
|
```
|
|
Integer → float. Return type inferred.
|
|
```zig
|
|
const f: f32 = @floatFromInt(42);
|
|
```
|
|
|
|
### @intFromPtr
|
|
```zig
|
|
@intFromPtr(ptr: anytype) usize
|
|
```
|
|
Pointer → `usize`. For pointer arithmetic or FFI.
|
|
```zig
|
|
const addr: usize = @intFromPtr(&x);
|
|
```
|
|
|
|
### @ptrFromInt
|
|
```zig
|
|
@ptrFromInt(addr: usize) anytype
|
|
```
|
|
`usize` → pointer. Return type inferred. **Undefined behavior if invalid.**
|
|
```zig
|
|
const ptr: *u32 = @ptrFromInt(0x1000);
|
|
```
|
|
|
|
### @ptrCast
|
|
```zig
|
|
@ptrCast(ptr: anytype) anytype
|
|
```
|
|
Pointer type cast. Return type inferred.
|
|
```zig
|
|
const bytes: [*]u8 = @ptrCast(some_ptr);
|
|
```
|
|
|
|
### @alignCast
|
|
```zig
|
|
@alignCast(ptr: anytype) anytype
|
|
```
|
|
Change pointer alignment. Safety check at runtime.
|
|
```zig
|
|
const aligned: *align(16) u8 = @alignCast(ptr);
|
|
```
|
|
|
|
### @constCast
|
|
```zig
|
|
@constCast(ptr: anytype) anytype
|
|
```
|
|
Remove `const` qualifier from pointer. Return type inferred.
|
|
```zig
|
|
const mutable_ptr: *u32 = @constCast(const_ptr);
|
|
```
|
|
|
|
### @volatileCast
|
|
```zig
|
|
@volatileCast(ptr: anytype) anytype
|
|
```
|
|
Remove `volatile` qualifier from pointer.
|
|
|
|
### @bitCast
|
|
```zig
|
|
@bitCast(value: anytype) anytype
|
|
```
|
|
Reinterpret bits as different type. Sizes must match. Return type inferred.
|
|
```zig
|
|
const bits: u32 = @bitCast(@as(f32, 1.0));
|
|
const f: f32 = @bitCast(@as(u32, 0x3f800000));
|
|
```
|
|
|
|
### @truncate
|
|
```zig
|
|
@truncate(value: anytype) anytype
|
|
```
|
|
Truncate integer to smaller type. Discards high bits. Return type inferred.
|
|
```zig
|
|
const small: u8 = @truncate(@as(u32, 0x12345678)); // 0x78
|
|
```
|
|
|
|
### @intFromBool
|
|
```zig
|
|
@intFromBool(value: bool) u1
|
|
```
|
|
`false` → 0, `true` → 1.
|
|
```zig
|
|
const x: u8 = @intFromBool(true); // 1
|
|
```
|
|
|
|
### @intFromEnum
|
|
```zig
|
|
@intFromEnum(value: anytype) anytype
|
|
```
|
|
Enum → backing integer type.
|
|
```zig
|
|
const State = enum(u8) { idle = 0, running = 1 };
|
|
const n: u8 = @intFromEnum(State.running); // 1
|
|
```
|
|
|
|
### @enumFromInt
|
|
```zig
|
|
@enumFromInt(int: anytype) anytype
|
|
```
|
|
Integer → enum. Return type inferred.
|
|
```zig
|
|
const state: State = @enumFromInt(1); // State.running
|
|
```
|
|
|
|
### @errorFromInt
|
|
```zig
|
|
@errorFromInt(int: anytype) anytype
|
|
```
|
|
Integer → error. Return type inferred.
|
|
|
|
### @intFromError
|
|
```zig
|
|
@intFromError(err: anytype) std.meta.Int(.unsigned, @bitSizeOf(anyerror))
|
|
```
|
|
Error → integer.
|
|
|
|
### @errorCast
|
|
```zig
|
|
@errorCast(err: anytype) anytype
|
|
```
|
|
Cast between error set types.
|
|
|
|
### @addrSpaceCast
|
|
```zig
|
|
@addrSpaceCast(ptr: anytype) anytype
|
|
```
|
|
Convert pointer between address spaces (GPU/embedded).
|
|
|
|
## Integer/Float Operations
|
|
|
|
### @abs
|
|
```zig
|
|
@abs(value: anytype) anytype
|
|
```
|
|
Absolute value. Works on integers, floats, vectors.
|
|
```zig
|
|
const x = @abs(@as(i32, -5)); // 5
|
|
```
|
|
|
|
### @min / @max
|
|
```zig
|
|
@min(a: T, b: T) T
|
|
@max(a: T, b: T) T
|
|
```
|
|
Return minimum/maximum of two values.
|
|
```zig
|
|
const m = @max(3, 7); // 7
|
|
```
|
|
|
|
### @divExact
|
|
```zig
|
|
@divExact(numerator: T, denominator: T) T
|
|
```
|
|
Exact division. Asserts no remainder.
|
|
```zig
|
|
const x = @divExact(10, 2); // 5
|
|
```
|
|
|
|
### @divFloor
|
|
```zig
|
|
@divFloor(numerator: T, denominator: T) T
|
|
```
|
|
Floor division (rounds toward negative infinity).
|
|
```zig
|
|
const x = @divFloor(-7, 3); // -3
|
|
```
|
|
|
|
### @divTrunc
|
|
```zig
|
|
@divTrunc(numerator: T, denominator: T) T
|
|
```
|
|
Truncating division (rounds toward zero).
|
|
```zig
|
|
const x = @divTrunc(-7, 3); // -2
|
|
```
|
|
|
|
### @mod
|
|
```zig
|
|
@mod(numerator: T, denominator: T) T
|
|
```
|
|
Floor modulus. Result has same sign as denominator.
|
|
```zig
|
|
const x = @mod(-5, 3); // 1
|
|
```
|
|
|
|
### @rem
|
|
```zig
|
|
@rem(numerator: T, denominator: T) T
|
|
```
|
|
Remainder. Result has same sign as numerator.
|
|
```zig
|
|
const x = @rem(-5, 3); // -2
|
|
```
|
|
|
|
### Math Functions (floats/vectors)
|
|
```zig
|
|
@sqrt(x) // Square root
|
|
@sin(x) // Sine
|
|
@cos(x) // Cosine
|
|
@tan(x) // Tangent
|
|
@exp(x) // e^x
|
|
@exp2(x) // 2^x
|
|
@log(x) // Natural log
|
|
@log2(x) // Log base 2
|
|
@log10(x) // Log base 10
|
|
@floor(x) // Round down
|
|
@ceil(x) // Round up
|
|
@round(x) // Round to nearest
|
|
@trunc(x) // Truncate toward zero
|
|
@mulAdd(T, a, b, c) // Fused (a*b)+c
|
|
```
|
|
|
|
## Overflow Arithmetic
|
|
|
|
Returns tuple: `{ result, overflow_bit }` where overflow_bit is `u1`.
|
|
|
|
### @addWithOverflow
|
|
```zig
|
|
@addWithOverflow(a: T, b: T) struct { T, u1 }
|
|
```
|
|
```zig
|
|
const result, const overflow = @addWithOverflow(@as(u8, 250), 10);
|
|
if (overflow != 0) { /* handle overflow */ }
|
|
```
|
|
|
|
### @subWithOverflow
|
|
```zig
|
|
@subWithOverflow(a: T, b: T) struct { T, u1 }
|
|
```
|
|
|
|
### @mulWithOverflow
|
|
```zig
|
|
@mulWithOverflow(a: T, b: T) struct { T, u1 }
|
|
```
|
|
|
|
### @shlWithOverflow
|
|
```zig
|
|
@shlWithOverflow(a: T, b: Log2Int) struct { T, u1 }
|
|
```
|
|
|
|
## Bit Manipulation
|
|
|
|
### @clz
|
|
```zig
|
|
@clz(value: anytype) anytype
|
|
```
|
|
Count leading zeros.
|
|
```zig
|
|
const z = @clz(@as(u8, 0b00001111)); // 4
|
|
```
|
|
|
|
### @ctz
|
|
```zig
|
|
@ctz(value: anytype) anytype
|
|
```
|
|
Count trailing zeros.
|
|
```zig
|
|
const z = @ctz(@as(u8, 0b11110000)); // 4
|
|
```
|
|
|
|
### @popCount
|
|
```zig
|
|
@popCount(value: anytype) anytype
|
|
```
|
|
Count set bits (population count).
|
|
```zig
|
|
const c = @popCount(@as(u8, 0b10101010)); // 4
|
|
```
|
|
|
|
### @byteSwap
|
|
```zig
|
|
@byteSwap(value: anytype) @TypeOf(value)
|
|
```
|
|
Reverse byte order (endianness conversion).
|
|
```zig
|
|
const swapped = @byteSwap(@as(u32, 0x12345678)); // 0x78563412
|
|
```
|
|
|
|
### @bitReverse
|
|
```zig
|
|
@bitReverse(value: anytype) @TypeOf(value)
|
|
```
|
|
Reverse all bits.
|
|
```zig
|
|
const rev = @bitReverse(@as(u8, 0b11000001)); // 0b10000011
|
|
```
|
|
|
|
### @shlExact / @shrExact
|
|
```zig
|
|
@shlExact(value: T, shift: Log2Int) T
|
|
@shrExact(value: T, shift: Log2Int) T
|
|
```
|
|
Shift with assertion that no bits are lost.
|
|
|
|
## Memory Operations
|
|
|
|
### @memcpy
|
|
```zig
|
|
@memcpy(dest: []T, src: []const T) void
|
|
```
|
|
Copy memory. Slices must not overlap.
|
|
```zig
|
|
@memcpy(dest[0..n], src[0..n]);
|
|
```
|
|
|
|
### @memset
|
|
```zig
|
|
@memset(dest: []T, value: T) void
|
|
```
|
|
Fill memory with value.
|
|
```zig
|
|
@memset(buffer[0..n], 0);
|
|
```
|
|
|
|
### @memmove
|
|
```zig
|
|
@memmove(dest: []T, src: []const T) void
|
|
```
|
|
Copy memory. Slices may overlap.
|
|
|
|
### @sizeOf
|
|
```zig
|
|
@sizeOf(comptime T: type) comptime_int
|
|
```
|
|
Size of type in bytes (includes padding).
|
|
```zig
|
|
const size = @sizeOf(u32); // 4
|
|
```
|
|
|
|
### @bitSizeOf
|
|
```zig
|
|
@bitSizeOf(comptime T: type) comptime_int
|
|
```
|
|
Size of type in bits.
|
|
```zig
|
|
const bits = @bitSizeOf(u24); // 24
|
|
```
|
|
|
|
### @alignOf
|
|
```zig
|
|
@alignOf(comptime T: type) comptime_int
|
|
```
|
|
Alignment requirement of type.
|
|
```zig
|
|
const align = @alignOf(u64); // typically 8
|
|
```
|
|
|
|
### @offsetOf
|
|
```zig
|
|
@offsetOf(comptime T: type, comptime field: []const u8) comptime_int
|
|
```
|
|
Byte offset of struct field.
|
|
```zig
|
|
const Point = struct { x: i32, y: i32 };
|
|
const off = @offsetOf(Point, "y"); // 4
|
|
```
|
|
|
|
### @bitOffsetOf
|
|
```zig
|
|
@bitOffsetOf(comptime T: type, comptime field: []const u8) comptime_int
|
|
```
|
|
Bit offset of field (useful for packed structs).
|
|
|
|
## Atomics
|
|
|
|
### @atomicLoad
|
|
```zig
|
|
@atomicLoad(comptime T: type, ptr: *const T, comptime ordering: AtomicOrder) T
|
|
```
|
|
Atomic read.
|
|
```zig
|
|
const val = @atomicLoad(u32, &counter, .acquire);
|
|
```
|
|
|
|
### @atomicStore
|
|
```zig
|
|
@atomicStore(comptime T: type, ptr: *T, value: T, comptime ordering: AtomicOrder) void
|
|
```
|
|
Atomic write.
|
|
```zig
|
|
@atomicStore(u32, &counter, 42, .release);
|
|
```
|
|
|
|
### @atomicRmw
|
|
```zig
|
|
@atomicRmw(comptime T: type, ptr: *T, comptime op: AtomicRmwOp, operand: T, comptime ordering: AtomicOrder) T
|
|
```
|
|
Atomic read-modify-write. Returns previous value.
|
|
```zig
|
|
const old = @atomicRmw(u32, &counter, .Add, 1, .seq_cst);
|
|
```
|
|
Operations: `.Add`, `.Sub`, `.And`, `.Or`, `.Xor`, `.Nand`, `.Min`, `.Max`, `.Xchg`
|
|
|
|
### @cmpxchgStrong / @cmpxchgWeak
|
|
```zig
|
|
@cmpxchgStrong(comptime T: type, ptr: *T, expected: T, new: T, success_order: AtomicOrder, fail_order: AtomicOrder) ?T
|
|
@cmpxchgWeak(comptime T: type, ptr: *T, expected: T, new: T, success_order: AtomicOrder, fail_order: AtomicOrder) ?T
|
|
```
|
|
Compare-and-swap. Returns `null` on success, old value on failure.
|
|
```zig
|
|
while (@cmpxchgWeak(u32, &counter, expected, new, .seq_cst, .seq_cst)) |actual| {
|
|
expected = actual;
|
|
}
|
|
```
|
|
|
|
## Type Introspection
|
|
|
|
### @TypeOf
|
|
```zig
|
|
@TypeOf(expr) type
|
|
```
|
|
Get type of expression at comptime.
|
|
```zig
|
|
const T = @TypeOf(some_value);
|
|
```
|
|
|
|
### @typeInfo
|
|
```zig
|
|
@typeInfo(comptime T: type) std.builtin.Type
|
|
```
|
|
Get detailed type information.
|
|
```zig
|
|
const info = @typeInfo(MyStruct);
|
|
if (info == .@"struct") {
|
|
for (info.@"struct".fields) |field| {
|
|
// field.name, field.type, etc.
|
|
}
|
|
}
|
|
```
|
|
|
|
### @Type - removed in Zig 0.16
|
|
|
|
`@Type` was removed in Zig 0.16. Use the specific type-construction builtin that matches the type you are creating:
|
|
|
|
Common replacements:
|
|
|
|
- integer type: `@Int(.signed, 32)`
|
|
- tuple type: `@Tuple(&.{ u32, []const u8 })`
|
|
- pointer type: `@Pointer(...)`
|
|
- function type: `@Fn(...)`
|
|
- struct type: `@Struct(...)`
|
|
- union type: `@Union(...)`
|
|
- enum type: `@Enum(...)`
|
|
- opaque type: write `opaque {}` directly
|
|
|
|
Keep `@typeInfo` for reflection; use the new builtins only when constructing types.
|
|
|
|
### @typeName
|
|
```zig
|
|
@typeName(comptime T: type) [:0]const u8
|
|
```
|
|
Get string name of type.
|
|
```zig
|
|
const name = @typeName(u32); // "u32"
|
|
```
|
|
|
|
### @hasDecl
|
|
```zig
|
|
@hasDecl(comptime T: type, comptime name: []const u8) bool
|
|
```
|
|
Check if type has declaration (const, fn, etc.).
|
|
```zig
|
|
if (@hasDecl(T, "init")) { T.init(); }
|
|
```
|
|
|
|
### @hasField
|
|
```zig
|
|
@hasField(comptime T: type, comptime name: []const u8) bool
|
|
```
|
|
Check if struct/union has field.
|
|
|
|
### @field
|
|
```zig
|
|
@field(value: anytype, comptime name: []const u8) anytype
|
|
```
|
|
Access field by comptime string name.
|
|
```zig
|
|
const x = @field(point, "x");
|
|
```
|
|
|
|
### @FieldType
|
|
```zig
|
|
@FieldType(comptime T: type, comptime name: []const u8) type
|
|
```
|
|
Get type of a struct field.
|
|
|
|
### @fieldParentPtr
|
|
```zig
|
|
@fieldParentPtr(field_ptr: anytype, comptime field_name: []const u8) anytype
|
|
```
|
|
Get pointer to containing struct from field pointer (for intrusive data structures).
|
|
```zig
|
|
const Node = struct { data: u32, hook: Hook };
|
|
fn getNode(hook: *Hook) *Node {
|
|
return @fieldParentPtr(hook, "hook");
|
|
}
|
|
```
|
|
|
|
### @tagName
|
|
```zig
|
|
@tagName(value: anytype) [:0]const u8
|
|
```
|
|
Get string name of enum/union tag.
|
|
```zig
|
|
const Color = enum { red, green, blue };
|
|
const name = @tagName(Color.red); // "red"
|
|
```
|
|
|
|
### @errorName
|
|
```zig
|
|
@errorName(err: anyerror) [:0]const u8
|
|
```
|
|
Get string name of error.
|
|
```zig
|
|
const name = @errorName(error.OutOfMemory); // "OutOfMemory"
|
|
```
|
|
|
|
## Comptime Utilities
|
|
|
|
### @import
|
|
```zig
|
|
@import(comptime path: []const u8) type
|
|
```
|
|
Import module. Special: `"std"`, `"builtin"`.
|
|
```zig
|
|
const std = @import("std");
|
|
const builtin = @import("builtin");
|
|
const other = @import("other.zig");
|
|
```
|
|
|
|
### @embedFile
|
|
```zig
|
|
@embedFile(comptime path: []const u8) *const [N:0]u8
|
|
```
|
|
Embed file contents as compile-time string.
|
|
```zig
|
|
const data = @embedFile("data.bin");
|
|
```
|
|
|
|
### @compileError
|
|
```zig
|
|
@compileError(comptime msg: []const u8) noreturn
|
|
```
|
|
Emit compile error with message.
|
|
```zig
|
|
if (condition) @compileError("Invalid configuration");
|
|
```
|
|
|
|
### @compileLog
|
|
```zig
|
|
@compileLog(args: ...) void
|
|
```
|
|
Print values at compile time for debugging.
|
|
```zig
|
|
@compileLog("x =", x, "T =", T);
|
|
```
|
|
|
|
### @This
|
|
```zig
|
|
@This() type
|
|
```
|
|
Get enclosing struct/union/enum type.
|
|
```zig
|
|
const Self = @This();
|
|
fn method(self: *Self) void { ... }
|
|
```
|
|
|
|
### @src
|
|
```zig
|
|
@src() std.builtin.SourceLocation
|
|
```
|
|
Get current source location (file, line, column, fn name).
|
|
|
|
### @inComptime
|
|
```zig
|
|
@inComptime() bool
|
|
```
|
|
Check if currently executing at comptime.
|
|
```zig
|
|
if (@inComptime()) {
|
|
// comptime path
|
|
} else {
|
|
// runtime path
|
|
}
|
|
```
|
|
|
|
### @setEvalBranchQuota
|
|
```zig
|
|
@setEvalBranchQuota(quota: u32) void
|
|
```
|
|
Increase comptime evaluation limit (default 1000).
|
|
```zig
|
|
@setEvalBranchQuota(100_000);
|
|
```
|
|
|
|
## SIMD/Vector
|
|
|
|
### @Vector
|
|
```zig
|
|
@Vector(len: comptime_int, T: type) type
|
|
```
|
|
Create SIMD vector type.
|
|
```zig
|
|
const Vec4f = @Vector(4, f32);
|
|
const v: Vec4f = .{ 1.0, 2.0, 3.0, 4.0 };
|
|
```
|
|
|
|
### @splat
|
|
```zig
|
|
@splat(value: anytype) anytype
|
|
```
|
|
Create vector with all elements equal to value. Return type inferred.
|
|
```zig
|
|
const ones: @Vector(4, f32) = @splat(1.0);
|
|
```
|
|
|
|
### @reduce
|
|
```zig
|
|
@reduce(comptime op: std.builtin.ReduceOp, value: anytype) ElementType
|
|
```
|
|
Reduce vector to scalar.
|
|
```zig
|
|
const sum = @reduce(.Add, vec); // sum all elements
|
|
const max = @reduce(.Max, vec); // find maximum
|
|
```
|
|
Operations: `.Add`, `.Mul`, `.And`, `.Or`, `.Xor`, `.Min`, `.Max`
|
|
|
|
### @shuffle
|
|
```zig
|
|
@shuffle(T: type, a: @Vector(N, T), b: @Vector(N, T), mask: @Vector(M, i32)) @Vector(M, T)
|
|
```
|
|
Rearrange vector elements using mask.
|
|
```zig
|
|
const a: @Vector(4, i32) = .{ 1, 2, 3, 4 };
|
|
const b: @Vector(4, i32) = .{ 5, 6, 7, 8 };
|
|
const result = @shuffle(i32, a, b, .{ 0, 4, 1, 5 }); // {1, 5, 2, 6}
|
|
// Positive indices select from a, indices >= len select from b
|
|
```
|
|
|
|
### @select
|
|
```zig
|
|
@select(T: type, pred: @Vector(N, bool), a: @Vector(N, T), b: @Vector(N, T)) @Vector(N, T)
|
|
```
|
|
Element-wise select: `pred[i] ? a[i] : b[i]`.
|
|
|
|
## C Interop
|
|
|
|
### @cImport - deprecated migration path
|
|
```zig
|
|
@cImport(expr) type
|
|
```
|
|
Import C header files. In Zig 0.16 this is deprecated as the long-term API; prefer translating headers in `build.zig` with `b.addTranslateC(...)` and importing `translate_c.createModule()`.
|
|
```zig
|
|
const c = @cImport({
|
|
@cDefine("_GNU_SOURCE", {});
|
|
@cInclude("stdio.h");
|
|
});
|
|
```
|
|
|
|
### @cInclude
|
|
```zig
|
|
@cInclude(comptime path: []const u8) void
|
|
```
|
|
Include C header (inside `@cImport`).
|
|
|
|
### @cDefine
|
|
```zig
|
|
@cDefine(comptime name: []const u8, value) void
|
|
```
|
|
Define C macro (inside `@cImport`).
|
|
|
|
### @cUndef
|
|
```zig
|
|
@cUndef(comptime name: []const u8) void
|
|
```
|
|
Undefine C macro.
|
|
|
|
### @extern
|
|
```zig
|
|
@extern(comptime T: type, options: ExternOptions) T
|
|
```
|
|
Declare external symbol.
|
|
|
|
### @export
|
|
```zig
|
|
@export(target: anytype, options: ExportOptions) void
|
|
```
|
|
Export symbol. **Takes pointer in 0.14.0+**.
|
|
```zig
|
|
@export(&my_fn, .{ .name = "exported_name" });
|
|
```
|
|
|
|
### C Varargs
|
|
```zig
|
|
@cVaStart() std.builtin.VaList // Start vararg processing
|
|
@cVaArg(*VaList, T) T // Get next vararg
|
|
@cVaCopy(*VaList) VaList // Copy vararg state
|
|
@cVaEnd(*VaList) void // End vararg processing
|
|
```
|
|
|
|
## Debug/Control Flow
|
|
|
|
### @branchHint
|
|
```zig
|
|
@branchHint(hint: std.builtin.BranchHint) void
|
|
```
|
|
Hint branch likelihood. Must be first statement in branch.
|
|
```zig
|
|
if (unlikely_condition) {
|
|
@branchHint(.cold);
|
|
// rarely executed
|
|
}
|
|
```
|
|
Hints: `.none`, `.likely`, `.unlikely`, `.cold`
|
|
|
|
### @breakpoint
|
|
```zig
|
|
@breakpoint() void
|
|
```
|
|
Insert debugger breakpoint.
|
|
|
|
### @trap
|
|
```zig
|
|
@trap() noreturn
|
|
```
|
|
Crash immediately (illegal instruction).
|
|
|
|
### @panic
|
|
```zig
|
|
@panic(msg: []const u8) noreturn
|
|
```
|
|
Trigger panic with message.
|
|
|
|
### @setRuntimeSafety
|
|
```zig
|
|
@setRuntimeSafety(enabled: bool) void
|
|
```
|
|
Enable/disable safety checks in current scope.
|
|
```zig
|
|
@setRuntimeSafety(false);
|
|
// Unsafe operations here
|
|
```
|
|
|
|
### @setFloatMode
|
|
```zig
|
|
@setFloatMode(mode: std.builtin.FloatMode) void
|
|
```
|
|
Set floating-point optimization mode.
|
|
```zig
|
|
@setFloatMode(.optimized); // Allow reordering, etc.
|
|
```
|
|
|
|
### @returnAddress
|
|
```zig
|
|
@returnAddress() usize
|
|
```
|
|
Get return address of current function.
|
|
|
|
### @frameAddress
|
|
```zig
|
|
@frameAddress() usize
|
|
```
|
|
Get frame pointer of current function.
|
|
|
|
### @errorReturnTrace
|
|
```zig
|
|
@errorReturnTrace() ?*std.builtin.StackTrace
|
|
```
|
|
Get error return trace (if available).
|
|
|
|
### @call
|
|
```zig
|
|
@call(modifier: std.builtin.CallModifier, fn: anytype, args: anytype) anytype
|
|
```
|
|
Call function with modifier.
|
|
```zig
|
|
const result = @call(.always_inline, my_fn, .{ arg1, arg2 });
|
|
```
|
|
Modifiers: `.auto`, `.never_inline`, `.always_inline`, `.always_tail`, `.never_tail`, `.compile_time`
|
|
|
|
### @prefetch
|
|
```zig
|
|
@prefetch(ptr: anytype, options: PrefetchOptions) void
|
|
```
|
|
Prefetch memory into cache.
|
|
```zig
|
|
@prefetch(ptr, .{ .rw = .read, .locality = 3 });
|
|
```
|
|
|
|
## WebAssembly
|
|
|
|
### @wasmMemorySize
|
|
```zig
|
|
@wasmMemorySize(index: u32) u32
|
|
```
|
|
Get WebAssembly memory size in pages.
|
|
|
|
### @wasmMemoryGrow
|
|
```zig
|
|
@wasmMemoryGrow(index: u32, delta: u32) u32
|
|
```
|
|
Grow WebAssembly memory by delta pages.
|
|
|
|
## GPU/Workgroup
|
|
|
|
```zig
|
|
@workGroupId(dim: u32) u32 // Get workgroup ID
|
|
@workGroupSize(dim: u32) u32 // Get workgroup size
|
|
@workItemId(dim: u32) u32 // Get work item ID within group
|
|
```
|