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 module

22.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.zig

22.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;