Zig Academy · Урок

extern struct и раскладка ABI

Сопоставляйте раскладку struct в памяти с C.

Урок 4 из 413 шагов

«extern struct и раскладка ABI» — бесплатный урок Zig Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Zig Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Zig Academy содержит 4 уроков всего.

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

Когда Zig вызывает код C, обе стороны должны соглашаться относительно разметки памяти. Этот общий контракт называется ABI.

Обычные структуры не дают гарантий

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

Войдите в extern struct

Пометьте тип как extern struct, и Zig разместит его поля в соответствии с ABI C, сопоставив их со структурой C поле за полем.

const Point = extern struct {
    x: i32,
    y: i32,
};

Поля сохраняют порядок

extern struct сохраняет ваш порядок объявления, как и C, поэтому первое поле всегда располагается первым в памяти.

Выравнивание как в C

В отличие от упакованной структуры, extern struct по-прежнему добавляет выравнивание для соблюдения границ, точно так же, как это сделал бы компилятор C.

Упакованная структура и extern struct

Используйте packed для побитово точного размещения, а extern — для соответствия расположению байтов в C. Они решают разные задачи размещения.

Передавайте структуры в C

extern struct можно напрямую передать в функцию C, поскольку её размещение соответствует заголовочному файлу, на основе которого была скомпилирована функция.

extern fn use_point(p: Point) void;

Проверьте размер

Убедитесь, что extern struct соответствует C, с помощью @sizeOf: эта встроенная функция сообщает общий размер в байтах, включая возможные отступы выравнивания.

const n = @sizeOf(Point); // 8

Проверьте смещения полей

Используйте @offsetOf, чтобы точно узнать, где начинается каждое поле. Это особенно удобно для проверки соответствия структуры C.

const off = @offsetOf(Point, "y"); // 4

Только совместимые с C типы

Поля в extern struct должны иметь типы, совместимые с C, поэтому специфичные для Zig конструкции, например срезы, внутри неё недопустимы.

Мост между Zig и C

Вместе extern struct и ABI C позволяют Zig и C безопасно обмениваться данными без копирования и догадок о размещении. 🔗

Быстрая проверка

Вспомните, с чем должна соответствовать extern struct.

Итоги

Вы узнали, что extern struct соответствует ABI C: поля сохраняют порядок и используют отступы в стиле C, структуру можно передавать в C, а проверить её можно с помощью @sizeOf и @offsetOf. 🎉

Можно начать бесплатно

Изучай Zig с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «extern struct и раскладка ABI» бесплатный?

Да — полный текст урока «extern struct и раскладка ABI» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Zig Academy, подпишись на CoddyKit PRO. Курс Zig Academy содержит 4 уроков всего.

Чему я научусь в уроке «extern struct и раскладка ABI»?

Сопоставляйте раскладку struct в памяти с C. Ты практикуешь Zig Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Zig Academy?

Предыдущий опыт не требуется. Zig Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «extern struct и раскладка ABI»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Zig Academy?

Да. Каждый урок Zig Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. packed struct для точной раскладки
  2. Целые числа произвольной разрядности, например u3
  3. Битовые поля и флаги
  4. extern struct и раскладка ABI
← Назад к Zig Academy