К основному содержанию
скилл CX Codex

zig-cinterop — скилл для Claude Code: C из Zig и Zig из C

Скилл объясняет агенту, как связать Zig и C: @cImport, translate-c, extern struct, экспорт функций и сборка смешанных проектов.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add mohitmishra786/low-level-dev-skills --skill zig-cinterop -a claude-code
Открыть на GitHub

Что делает zig-cinterop

Скилл включается, когда в коде появляется @cImport или @cInclude, когда нужно вызвать функцию C из Zig, отдать Zig-функцию в C или разобраться, что translate-c сгенерировал из заголовка. Агент получает готовые схемы: таблицу соответствия типов (int → c_int, size_t → usize, char * → [*:0]u8), примеры extern struct для точного совмещения с C-структурой и packed struct для битовых полей и сетевых заголовков.

Внутри — рабочие фрагменты для девяти сценариев: импорт заголовков с @cDefine и @cUndef, передача строк с нулевым терминатором, непрозрачные типы вроде FILE, вариативные функции, экспорт через export fn и callconv(.C). Отдельный раздел про build.zig: linkLibC() нужен, когда вызываешь функции C, а для обратного направления Zig собирается в статическую библиотеку, которую линкует C-исполняемый файл.

Одна вещь, о которой стоит помнить сразу: без linkLibC() в build.zig линковка C-функций упадёт, и агент об этом предупреждает. Скилл ссылается на references/translate-c-guide.md и на соседние скиллы того же репозитория — zig-compiler, zig-build-system, elf-inspection и rust-ffi для сравнения с Rust.

Какие задачи решает

  • вызвать функцию C из Zig через @cImport
  • посмотреть, во что translate-c превращает заголовок
  • описать C-структуру как extern struct без сдвига полей
  • уложить битовые поля в packed struct
  • собрать в build.zig проект, где C и Zig линкуются вместе

Примеры запросов агенту

  • Помоги вызвать snprintf из Zig через @cImport, нужен буфер с нулевым терминатором
  • Переведи mylib.h через translate-c и покажи, как выглядит struct MyStruct
  • Собери в build.zig статическую библиотеку из Zig и слинкуй её с C-файлом src/main.c

Как установить zig-cinterop

1Через Skills CLI (Vercel)

npx skills add mohitmishra786/low-level-dev-skills --skill zig-cinterop -a claude-code

2Вручную: положить файлы

~/.claude/skills/zig-cinterop/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/zig-cinterop/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора62

wasm-emscripten Скилл ведёт агента через сборку C и C++ в WebAssembly: подбор флагов emcc, экспорт функций, модель памяти, Asyncify и отладка .wasm. CX Codex +1 513установок zig-debugging Скилл для ИИ-агента: разбирает паники Zig, error return traces и сессии GDB/LLDB. Пригодится, когда программа падает, а стек нечитаемый. CX Codex +1 511установок zig-build-system Помогает агенту писать и отлаживать build.zig: исполняемые файлы, библиотеки, C-исходники, опции сборки и тесты. CX Codex +1 508установок build-acceleration Скилл для ИИ-агентов, который помогает разобраться, почему сборка C/C++ идёт медленно, и настроить кэш, распределённую компиляцию и PCH. CX Codex +1 506установок include-what-you-use Скилл ведёт агента через IWYU: разбирает отчёты, применяет mapping-файлы и убирает лишние #include, из-за которых сборка C++ расползается. CX Codex +1 480установок rust-no-std Скилл для разработки на Rust без стандартной библиотеки: разбирает границу core, alloc и std, глобальные аллокаторы и обработчики паник. CX Codex +1 474установок dwarf-debug-format Скилл объясняет агенту, как читать отладочную информацию DWARF: секции ELF, split DWARF, debuginfod, влияние LTO и stripping. CX Codex +1 471установок intel-vtune-amd-uprof Скилл для профилирования процессора: помогает найти горячие функции, разобрать промахи кэша и заторы конвейера через Intel VTune и AMD uProf. CX Codex +1 469установок

Похожие

rust-pro Seth Hobson Субагент на модели Opus для разработки на Rust 1.75+. Помогает писать асинхронный код на Tokio и axum, настраивать многопоточность и разбираться с проверками заимствований. CX Codex 1 148установок dart-use-ffigen flutter Скилл учит агента генерировать FFI-биндинги через package:ffigen вместо ручного написания. Используй, когда нужно создать или расширить привязки к C/Objective-C/Swift библиотекам. CX Codex +1 14 000установок dart-setup-ffi-assets flutter Скилл помогает агентам автоматизировать компиляцию и упаковку кода на C/C++ в динамические или статические библиотеки через систему Native Assets в Dart. Нужен, если вы интегрируете нативный код в Flutter или Dart-пакеты. CX Codex +1 14 000установок ue-module-build-system quodsoler Скилл для работы с Build.cs, Target.cs, .uproject и .uplugin в Unreal Engine 5.8: подсказывает зависимости, экспорт-макросы и разбор ошибок сборки. CX Codex +1 1 200установок cmux-ghostty manaflow-ai Регламентирует работу с сабмодулем Ghostty и сборку GhosttyKit в репозитории cmux. Пригодится при синхронизации форка и обновлении указателей Git. CX Codex +1 4 700установок native-sdk vercel-labs Скилл помогает ИИ-агенту создавать десктопные приложения через Native SDK на TypeScript и разметке .native. Нужен для настройки сборки, интерфейса и встроенной автоматизации. CX Codex +1 1 500установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о zig-cinterop

Как установить zig-cinterop в Claude?

Выполни npx skills add mohitmishra786/low-level-dev-skills --skill zig-cinterop -a claude-code. Скилл окажется в ~/.claude/skills/zig-cinterop/SKILL.md.

Что делает zig-cinterop?

Ведёт агента по совместимости Zig и C: импорт заголовков, разбор вывода translate-c, ABI-совместимые структуры, экспорт Zig-функций и смешанная сборка.

Чем translate-c отличается от @cImport?

translate-c — отдельная команда, которая печатает Zig-объявления из C-заголовка, чтобы посмотреть результат. В коде ты обычно пишешь @cImport, а translate-c нужен для проверки того, что Zig видит в API.

Исходный текст

SKILL.md · MIT
---
name: zig-cinterop
description: Zig C interoperability skill. Use when calling C from Zig, calling Zig from C, using @cImport and @cInclude, running translate-c on C headers, defining extern structs and packed structs, matching C ABI types, or building mixed C/Zig projects. Activates on queries about @cImport, @cInclude, translate-c, extern struct, packed struct, Zig C ABI, calling C from Zig, exporting Zig to C, or bindgen equivalents.
---

# Zig C Interop

## Purpose

Guide agents through Zig's C interoperability: `@cImport`/`@cInclude` for calling C, `translate-c` for header inspection, `extern struct` and `packed struct` for ABI-compatible types, exporting Zig for C consumption, and `zig cc` for mixed C/Zig builds.

## Triggers

- "How do I call a C function from Zig?"
- "How do I use @cImport and @cInclude?"
- "How do I export Zig functions to be called from C?"
- "How do I define a struct that matches a C struct?"
- "What does translate-c do?"
- "How do I build a mixed C and Zig project?"

## Workflow

### 1. Calling C from Zig with @cImport

```zig
const c = @cImport({
    @cInclude("stdio.h");
    @cInclude("string.h");
    @cInclude("mylib.h");
    @cDefine("MY_FEATURE", "1");  // Equivalent to -DMY_FEATURE=1
    @cUndef("SOME_MACRO");
});

pub fn main() void {
    _ = c.printf("Hello from C: %d\n", @as(c_int, 42));

    var buf: [256]u8 = undefined;
    _ = c.snprintf(&buf, buf.len, "formatted: %d", @as(c_int, 100));
}
```

In `build.zig`:
```zig
exe.linkLibC();  // Required when using C functions
exe.addIncludePath(b.path("include/"));
```

### 2. translate-c — inspect C header translation

`translate-c` converts C headers to Zig declarations, letting you see exactly how Zig sees a C API:

```bash
# Translate a header file
zig translate-c /usr/include/stdio.h > stdio.zig

# Translate with defines/includes
zig translate-c -I include/ -DFEATURE=1 mylib.h > mylib.zig

# Translate and inspect specific types
zig translate-c mylib.h | grep -A5 "struct MyStruct"
```

This is Zig's equivalent of `bindgen` — you use it to understand what Zig generates, then use `@cImport` directly in code.

### 3. C type mapping

| C type | Zig type |
|--------|----------|
| `int` | `c_int` |
| `unsigned int` | `c_uint` |
| `long` | `c_long` |
| `unsigned long` | `c_ulong` |
| `long long` | `c_longlong` |
| `size_t` | `usize` |
| `ssize_t` | `isize` |
| `char *` | `[*:0]u8` (null-terminated) |
| `const char *` | `[*:0]const u8` |
| `void *` | `*anyopaque` |
| `NULL` | `null` |
| `bool` | `bool` (C99) or `c_int` (older) |
| `float` | `f32` |
| `double` | `f64` |

```zig
// Passing strings to C
const str = "hello";
_ = c.puts(str);  // Zig string literals are [*:0]const u8

// Dynamic strings — need null terminator
var buf: [64:0]u8 = undefined;
const len = std.fmt.bufPrint(buf[0..63], "hello {d}", .{42}) catch unreachable;
buf[len] = 0;
_ = c.puts(&buf);
```

### 4. extern struct — ABI-compatible structs

Use `extern struct` to match a C struct's memory layout exactly:

```zig
// Matches: struct Point { int x; int y; };
const Point = extern struct {
    x: c_int,
    y: c_int,
};

// Matches: struct Header { uint32_t magic; uint16_t version; uint16_t flags; };
const Header = extern struct {
    magic: u32,
    version: u16,
    flags: u16,
};

// Use with C API
var p = Point{ .x = 10, .y = 20 };
_ = c.draw_point(&p);
```

### 5. packed struct — bit-level layout

```zig
// Matches C bitfield: struct { uint8_t flags : 4; uint8_t type : 4; };
const Flags = packed struct(u8) {
    mode: u4,
    kind: u4,
};

// Packed struct for wire protocols
const IpHeader = packed struct(u32) {
    ihl: u4,
    version: u4,
    tos: u8,
    total_length: u16,
};

var h: IpHeader = @bitCast(@as(u32, raw_bytes));
```

### 6. Exporting Zig to C

```zig
// Export a function callable from C
export fn zig_add(a: c_int, b: c_int) c_int {
    return a + b;
}

// Export with specific calling convention
pub fn my_func(x: u32) callconv(.C) u32 {
    return x * 2;
}

// Export a struct (use extern struct for C layout)
export const VERSION: c_int = 42;
```

Generate a C header (manual or with tools):
```c
/* mylib.h */
#ifndef MYLIB_H
#define MYLIB_H
#include <stdint.h>

int zig_add(int a, int b);
uint32_t my_func(uint32_t x);
extern int VERSION;

#endif
```

### 7. Calling Zig from C in build.zig

```zig
// Build Zig as a C-compatible static library
const lib = b.addStaticLibrary(.{
    .name = "myzig",
    .root_source_file = b.path("src/lib.zig"),
    .target = target,
    .optimize = optimize,
});

// The C code that uses the Zig library
const c_exe = b.addExecutable(.{
    .name = "c_consumer",
    .target = target,
    .optimize = optimize,
});
c_exe.addCSourceFile(.{
    .file = b.path("src/main.c"),
    .flags = &.{"-std=c11"},
});
c_exe.linkLibrary(lib);
c_exe.linkLibC();
b.installArtifact(c_exe);
```

### 8. Opaque types and forward declarations

```zig
// Forward-declared C struct (opaque)
const FILE = opaque {};
extern fn fopen(path: [*:0]const u8, mode: [*:0]const u8) ?*FILE;
extern fn fclose(file: *FILE) c_int;
extern fn fprintf(file: *FILE, fmt: [*:0]const u8, ...) c_int;

// Opaque handle pattern
const MyHandle = opaque {};
extern fn lib_create() ?*MyHandle;
extern fn lib_destroy(h: *MyHandle) void;
```

### 9. Variadic functions

```zig
// Call variadic C functions using @call with variadic args
const c = @cImport(@cInclude("stdio.h"));

// printf works directly through @cImport
_ = c.printf("value: %d\n", @as(c_int, 42));

// For custom variadic C functions, use extern with ...
extern fn my_log(level: c_int, fmt: [*:0]const u8, ...) void;
```

For translate-c output guide and C ABI types reference, see [references/translate-c-guide.md](references/translate-c-guide.md).

## Related skills

- Use `skills/zig/zig-compiler` for `zig cc` C compilation and basic Zig builds
- Use `skills/zig/zig-build-system` for `build.zig` with mixed C/Zig projects
- Use `skills/binaries/elf-inspection` to verify symbol exports and ABI
- Use `skills/rust/rust-ffi` for comparison with Rust's C FFI approach

© mohitmishra786 · MIT · mohitmishra786/low-level-dev-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой