Взаимодействие с C

Подключаем C-библиотеки напрямую через @cImport — без ручных обёрток.

@cImport — встроенная функция Zig, которая разбирает C-заголовочные файлы прямо во время компиляции и делает их функции и типы доступными в Zig без написания обёрток.

Огромное преимущество Zig — он идеально дружит с C. Не через генераторы биндингов, не через ручные обёртки, а напрямую: Zig содержит C-компилятор и парсер заголовков, поэтому может подключать C-библиотеки так, будто они написаны на Zig.

Прямой импорт заголовка

const c = @cImport({
    @cInclude("stdio.h"); // подключаем C-заголовок
});

pub fn main() void {
    _ = c.printf("Привет из C-функции!\n"); // вызов printf напрямую
}

@cImport принимает блок с директивами @cInclude, разбирает указанные заголовки и возвращает структуру со всеми объявленными функциями, типами и константами. После этого c.printf — обычный вызов C-функции прямо из Zig. Никаких .h-обёрток вручную писать не нужно.

Линковка C-библиотеки

# подключить системную libc и собрать
zig build-exe main.zig -lc

# слинковать с конкретной C-библиотекой, например libm
zig build-exe main.zig -lc -lm

Чтобы вызовы C-функций нашли реализацию, библиотеку линкуют флагом -l. Флаг -lc подключает стандартную C-библиотеку. Поскольку Zig умеет и компилировать C, можно даже включить .c-файлы прямо в сборку Zig-проекта через build.zig.

Zig как компилятор C

# Zig умеет собирать чистый C — как замена gcc/clang
zig cc main.c -o app

# и кросс-компилировать C под другую платформу одной командой
zig cc main.c -target aarch64-linux -o app

Команда zig cc делает Zig полноценной заменой gcc или clang для C — с той же встроенной кросс-компиляцией. Многие проекты используют Zig только ради этого, даже не написав ни строки на Zig: он решает вечную боль кросс-сборки C-кода.

Как работает под капотом

@cImport внутри запускает встроенный в Zig Clang для разбора заголовков и переводит C-объявления в Zig-типы автоматически. C-функции вызываются по обычному C ABI — без накладных расходов, ведь Zig и так использует ту же модель вызовов, что и C. Это делает интеграцию по-настоящему «бесшовной»: граница между Zig и C почти не ощущается ни в коде, ни в производительности.

Частые ошибки

Первая — забыть -lc при использовании функций libc и получить ошибку линковки. Вторая — ждать обёрток с проверкой ошибок: импортированные C-функции возвращают C-типы (например, ?[*]u8 для возможного null), и проверять их нужно вручную. Третья — недооценить zig cc: это полноценный кросс-компилятор C, а не игрушка.

Итог

  • @cImport/@cInclude разбирают C-заголовки и дают их функции напрямую, без обёрток.
  • C-библиотеки линкуют флагом -l; -lc подключает стандартную libc.
  • zig cc делает Zig заменой gcc/clang с встроенной кросс-компиляцией C.
  • Вызовы идут по C ABI без накладных расходов — интеграция бесшовная.
Проверьте себя
1. Что делает @cImport в Zig?
AИмпортирует Zig-модуль
BРазбирает C-заголовки при компиляции и делает их функции доступными без ручных обёрток
CКонвертирует C-код в Zig-код навсегда
DСоздаёт сетевое соединение
2. Что делает команда zig cc?
AЗапускает интерпретатор Zig
BДелает Zig полноценным компилятором C (замена gcc/clang) со встроенной кросс-компиляцией
CОчищает кеш сборки
DСоздаёт C-заголовки из Zig