EMZETT.
Login

Kurz: Zig kann C-Header direkt einlesen und C-Funktionen ohne Bindings aufrufen. Außerdem ist zig cc ein vollwertiger C/C++-Compiler (Clang) mit hervorragendem Cross-Compiling:

Teil des Kurses Zig

Kapitel 7 von 8 im Kurs Zig (Abschnitt „Praxis“). Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

C-Interop

Zig kann C-Header direkt einlesen und C-Funktionen ohne Bindings aufrufen. Außerdem ist zig cc ein vollwertiger C/C++-Compiler (Clang) mit hervorragendem Cross-Compiling:

const std = @import("std");
const c = @cImport({
    @cInclude("stdio.h");
    @cInclude("stdlib.h");
    @cInclude("string.h");
    @cInclude("math.h");
});
 
pub fn main() !void {
    const out = std.io.getStdOut().writer();
    try out.print("{d}\n", .{c.abs(-42)});
    try out.print("{d:.3}\n", .{c.sqrt(2.0)});
    try out.print("{d}\n", .{c.strlen("Hallo")});
    const n = c.atoi("1234");
    try out.print("{d}\n", .{n + 1});
}
zig run -lc c_interop.zig

Auch umgekehrt: Zig-Funktionen mit export fn und callconv(.C) sind aus C aufrufbar. Cross-Compiling:

zig build-exe hallo.zig -target x86_64-windows        # Windows-Programm unter Linux bauen
zig build-exe hallo.zig -target aarch64-macos         # für Apple Silicon
zig build-exe hallo.zig -target arm-linux-musleabihf  # Raspberry Pi
zig cc -target x86_64-linux-musl -o prog prog.c       # C-Code mit Zig kompilieren

Das Build-System

Projekte beschreibt build.zig – in Zig selbst:

const std = @import("std");
 
pub fn build(b: *std.Build) void {
    const target = b.standardTargetOptions(.{});
    const optimize = b.standardOptimizeOption(.{});
 
    const exe = b.addExecutable(.{
        .name = "meine_app",
        .root_source_file = b.path("src/main.zig"),
        .target = target,
        .optimize = optimize,
    });
    b.installArtifact(exe);
 
    const run = b.addRunArtifact(exe);
    b.step("run", "App starten").dependOn(&run.step);
 
    const tests = b.addTest(.{ .root_source_file = b.path("src/main.zig"), .target = target, .optimize = optimize });
    b.step("test", "Tests ausführen").dependOn(&b.addRunArtifact(tests).step);
}
zig build                      # bauen
zig build run                  # starten
zig build test                 # Tests
zig build -Doptimize=ReleaseFast
zig fmt src/                   # formatieren

Pakete (Abhängigkeiten) trägst du in build.zig.zon ein.

Merke

  • C-Header per @cImport, Cross-Compiling mit -target, zig cc als C-Compiler
  • build.zig beschreibt Projekte in Zig; zig build run/test
  • Abhängigkeiten stehen in build.zig.zon

Übungsaufgabe

Rufe aus Zig die C-Funktion pow aus math.h auf und gib pow(2, 10) aus.

Quiz zur Selbstkontrolle

Weiter im Kurs

Zurück: comptime, Generics und Tests

Weiter: Nebenläufigkeit und Spickzettel

Alle Kapitel: Zig im Überblick