Взаимодействие с 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 без накладных расходов — интеграция бесшовная.