Modules, Files and Code Organization
22.1 @import
Each file is a struct namespace. Only pub declarations are visible to importers.
Imports are lazily analyzed. Unused code isn't compiled (or even type-checked) until it's referenced ("lazy analysis").
const std = @import("std"); // standard library
const builtin = @import("builtin"); // compile-time build info (target, mode)
const utils = @import("utils.zig"); // a relative file
const Parser = @import("Parser.zig"); // a file-as-struct
const zap = @import("zap"); // a module provided by build.zig (a package)
const config = @import("config"); // build options module22.2 Project Layout
myproject/
├── build.zig
├── build.zig.zon
├── src/
│ ├── main.zig # executable entry
│ ├── root.zig # library root (public API)
│ ├── Parser.zig
│ └── util/
│ ├── strings.zig
│ └── math.zig
└── tests/
└── integration.zig22.3 Re-exporting and Namespaces
usingnamespace was removed in 0.15. Re-export explicitly with pub const x = other.x;.
// root.zig
pub const Parser = @import("Parser.zig");
pub const strings = @import("util/strings.zig");
pub const version = "1.0.0";
test {
std.testing.refAllDecls(@This()); // ensure all decls are analyzed and tested
}22.4 builtin Module
const builtin = @import("builtin");
if (builtin.os.tag == .windows) {}
if (builtin.mode == .Debug) {}
if (builtin.cpu.arch == .x86_64) {}
if (builtin.is_test) {}
if (builtin.link_libc) {}
const endian = builtin.cpu.arch.endian();
_ = endian;