Important Builtins in Zig 1.16
This chapter covered the builtins you will see most often as a beginner.
Important Builtins in Zig 1.16
This chapter covered the builtins you will see most often as a beginner.
A builtin is a compiler-provided function. Its name starts with @.
@import("std")
@sizeOf(u32)
@alignOf(u32)
@intCast(x)
These are not standard library functions. They are part of the language.
Type and Module Builtins
Use these to import code or work with types.
| Builtin | Meaning |
|---|---|
@import |
Load a Zig module or source file |
@TypeOf |
Get the type of a value |
@typeInfo |
Inspect a type |
@Type |
Build a type from type information |
@typeName |
Get the name of a type |
Example:
const std = @import("std");
const x = 123;
const T = @TypeOf(x);
pub fn main() void {
std.debug.print("{s}\n", .{@typeName(T)});
}
Memory Layout Builtins
Use these when you need to understand how data is stored.
| Builtin | Meaning |
|---|---|
@sizeOf |
Number of bytes used by a type |
@alignOf |
Required memory alignment of a type |
@offsetOf |
Byte offset of a struct field |
@bitSizeOf |
Number of bits used by a type |
Example:
const std = @import("std");
const Point = struct {
x: i32,
y: i32,
};
pub fn main() void {
std.debug.print("size: {}\n", .{@sizeOf(Point)});
std.debug.print("align: {}\n", .{@alignOf(Point)});
}
Conversion Builtins
Use these when converting values explicitly.
| Builtin | Meaning |
|---|---|
@intCast |
Convert between integer types, checking that the value fits |
@truncate |
Keep only the low bits of an integer |
@floatCast |
Convert between floating-point types |
@floatFromInt |
Convert an integer to a float |
@intFromFloat |
Convert a float to an integer |
@bitCast |
Reinterpret bits as another type of the same size |
The important distinction is this:
@intCast preserves numeric meaning.
@truncate preserves low bits.
@bitCast preserves raw representation.
Example:
const x: u16 = 300;
const a: u8 = @truncate(x); // 44
Do not use @truncate when you mean “safe integer conversion.” Use @intCast with a range check.
Pointer and Memory Builtins
Use these when working close to raw memory.
| Builtin | Meaning |
|---|---|
@ptrCast |
Reinterpret a pointer as another pointer type |
@alignCast |
Assert stronger pointer alignment |
@constCast |
Remove const from a pointer |
@volatileCast |
Change volatile qualification |
@memcpy |
Copy memory from source to destination |
@memset |
Fill memory with a repeated value |
Example:
var buffer = [_]u8{0} ** 5;
const text = "hello";
@memcpy(&buffer, text);
Use pointer casts carefully. They do not move memory, fix alignment, or prove that the pointed-to memory has the new type.
Compile-Time Control Builtins
Use these to guide compilation.
| Builtin | Meaning |
|---|---|
@compileError |
Stop compilation with a message |
@compileLog |
Print compile-time debugging information |
@setEvalBranchQuota |
Raise the compile-time branch limit |
@panic |
Stop the running program with a message |
Example:
comptime {
if (@sizeOf(usize) != 8) {
@compileError("this program requires a 64-bit target");
}
}
@compileError is for invalid code or unsupported targets.
@panic is for runtime states that should not happen.
File Builtins
Use these to include build-time files.
| Builtin | Meaning |
|---|---|
@embedFile |
Embed a file’s bytes into the executable |
Example:
const help_text = @embedFile("help.txt");
The file is read during compilation. The final executable contains the bytes.
Beginner Rule
Most Zig programs use only a small set of builtins often:
@import
@sizeOf
@alignOf
@TypeOf
@intCast
@truncate
@floatCast
@bitCast
@ptrCast
@memcpy
@panic
@compileError
@embedFile
Learn these first.
Do not try to memorize every builtin at once. Read each one by asking:
What special thing is the compiler being asked to do?
That question usually explains the code.